2012-02-09 16 views
5

JTextFieldsを使用するときは、デフォルトのテキストを設定するのが好きです。JTextfieldのデフォルトの選択を解除する

私はプログラムを実行し、このデフォルトのテキストが自動的に選択されます(少なくとも1つのフィールドしかない場合)。つまり、すぐに文字を入力すると、デフォルトのテキストが削除され、新しいテキストに置き換えられます。

私の質問は、既定のテキストを削除せずに文字を入力できるように、既定の設定を変更する方法です。私はデフォルトのテキストの最後に手紙を追加するだけです。

は、ここに私のコードです:

public class ButtonsNText extends JPanel implements ActionListener, KeyListener { 

private JTextField TextLine; 
private JToggleButton UpperCaseButton; 
private JToggleButton LowerCaseButton; 
private JCheckBox ContinuousButton; 
private ButtonGroup myButtonGroup; 

public ButtonsNText(){ 
    TextLine = new JTextField(10); 
    add(TextLine); TextLine.setName("TextLine"); 
    TextLine.setText("default text"); 
    TextLine.setCaretPosition(TextLine.getText().length()); 
    TextLine.addKeyListener(this); 
    myButtonGroup = new ButtonGroup(); 
    UpperCaseButton = new JToggleButton("Upper case"); 
    add(UpperCaseButton);UpperCaseButton.setName("UpperCaseButton"); 
    LowerCaseButton = new JToggleButton("Lower case"); 
    add(LowerCaseButton); LowerCaseButton.setName("LowerCaseButton"); 
    ContinuousButton = new JCheckBox("Continuous?"); 
    add(ContinuousButton); ContinuousButton.setName("ContinuousButton"); 
    myButtonGroup.add(UpperCaseButton); myButtonGroup.add(LowerCaseButton); 
    UpperCaseButton.addActionListener(this); 
    LowerCaseButton.addActionListener(this); 
    ContinuousButton.addActionListener(this); 

} 
public static void main(String[] args) { 
    JFrame frame = new JFrame("Hello world example"); 
    frame.add(new ButtonsNText()); 
    frame.pack(); 
    frame.setVisible(true); 
} 
@Override 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource() == UpperCaseButton){ 
     TextLine.setText(TextLine.getText().toUpperCase()); 
    } 
    else if(e.getSource() == LowerCaseButton){ 
     TextLine.setText(TextLine.getText().toLowerCase()); 
    } 
} 
@Override 
public void keyReleased(KeyEvent k) { 
    if(ContinuousButton.isSelected()){ 
     if(UpperCaseButton.isSelected()){ 
      int pos = TextLine.getCaretPosition(); 
      TextLine.setText(TextLine.getText().toUpperCase()); 
      TextLine.setCaretPosition(pos); 
     } 
     else if(LowerCaseButton.isSelected()){ 
      int pos = TextLine.getCaretPosition(); 
      TextLine.setText(TextLine.getText().toLowerCase()); 
      TextLine.setCaretPosition(pos); 

     } 
    } 
    int key = k.getKeyCode(); 
    if(key == KeyEvent.VK_ENTER){ 
     if(UpperCaseButton.isSelected()){ 
      TextLine.setText(TextLine.getText().toUpperCase()); 
     } 
     else if(LowerCaseButton.isSelected()){ 
      TextLine.setText(TextLine.getText().toLowerCase()); 
     } 
    } 
} 

}

私はisFocusable()、setFocusable()、setCaterPosition()および他の同様の方法のようなものを試してみましたが、ここで私は、私は別のアプローチが必要だと思います。

+0

を削除されます: はここにあなたの助けのためのコードを参照してください。 –

+1

Java命名規則を学び、それらに固執してください – kleopatra

+1

...とキーストーリーを使用していません – kleopatra

答えて

3

とよりよいヘルプについて

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.DefaultCaret; 
import javax.swing.text.DefaultHighlighter; 
import javax.swing.text.Highlighter; 

public class TestTextComponents extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTextField jTextField1; 
    private JTextField jTextField2; 

    public TestTextComponents() { 
     initComponents(); 
    } 

    private void initComponents() { 
     jTextField1 = new JTextField(); 
     jTextField2 = new JTextField(); 
     getContentPane().setLayout(new FlowLayout()); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setTitle("Text component persistent selection"); 
     setResizable(false); 
     getContentPane().add(new JLabel(
       "Please skip between text fields and watch persistent selection: ")); 
     jTextField1.setText("jTextField1"); 
     getContentPane().add(jTextField1); 
     jTextField2.setText("jTextField2"); 
     getContentPane().add(jTextField2); 
     jTextField1.setCaret(new HighlightCaret()); 
     jTextField2.setCaret(new HighlightCaret()); 
     //Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     // setBounds((screenSize.width - 600)/2, (screenSize.height - 70)/2, 600, 70); 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTextComponents().setVisible(true); 
      } 
     }); 
    } 
} 

class HighlightCaret extends DefaultCaret { 

    private static final Highlighter.HighlightPainter unfocusedPainter = 
      new DefaultHighlighter.DefaultHighlightPainter(new Color(230, 230, 210)); 
    private static final long serialVersionUID = 1L; 
    private boolean isFocused; 

    @Override 
    protected Highlighter.HighlightPainter getSelectionPainter() { 
     return isFocused ? super.getSelectionPainter() : unfocusedPainter; 
    } 

    @Override 
    public void setSelectionVisible(boolean hasFocus) { 
     if (hasFocus != isFocused) { 
      isFocused = hasFocus; 
      super.setSelectionVisible(false); 
      super.setSelectionVisible(true); 
     } 
    } 
} 
+0

これは非常に素晴らしいです。この回答を削除しないでください!/Pete –

+0

@ Hovercraft Eelsのピップピップピップ_ _ _ _ ... – mKorbel

+0

@mKorbel:50Kのマイルストーンに達するためのおめでとう:-) –

3

キャレットを最後まで移動するとどうなりますか?

txt.setCaretPosition(txt.getText().length()); 
+0

ええ、私はそれを試みたが、助けていない。 –

+2

*「私はそれを試しました」*最高の試行を示すSSCCEを投稿してみてください。結局のところ、私たちは読者を気にしません。 –

+2

txt.getDext()。length()の代わりにtxt.getDocument()。getLength()を使用します。 – camickr

6

だけtfield2.setCaretPositionと一緒に、あなたのために尽くします博したフォーカスのための1つのFocusListener、追加(tfield2.getDocumentを()のgetLength());すぐに、[SSCCE](http://sscce.org/)を投稿@Peteため

import java.awt.event.*; 

import javax.swing.*; 

public class TextFieldExample extends JFrame 
{ 
    public TextFieldExample() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     JPanel contentPane = new JPanel(); 
     JTextField tfield = new JTextField(10); 
     final JTextField tfield2 = new JTextField(10); 
     tfield2.setText("default text"); 
     tfield2.addFocusListener(new FocusListener() 
     { 
      public void focusGained(FocusEvent fe) 
      { 
       tfield2.setCaretPosition(tfield2.getDocument().getLength()); 
      } 

      public void focusLost(FocusEvent fe) 
      { 
      } 
     }); 

     contentPane.add(tfield); 
     contentPane.add(tfield2); 

     setContentPane(contentPane); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TextFieldExample(); 
      } 
     }); 
    } 
} 
+0

+1 getText()。length()の代わりに 'getDocument()。getLength()'を使用する場合は+1。 – camickr

+0

あなたの良いアドバイスを+1します。 –

関連する問題