2012-05-09 8 views
0

ENTERボタンを押して更新する代わりに、即座にディスプレイに更新するテキストフィールドの入力を変更したいと思います。テキストフィールドから即座に更新を取得するには?

ここに私のコードです。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class MyProgram01 extends JFrame 
{ 
    private JTextField text1; 
    private JCheckBox check1; 
    private JCheckBox check2; 
    private String message; 
    private JLabel label1; 
    private JLabel label2; 
    private Font font; 

    public MyProgram01(String title) 
    { 
     super(title); 
     check1 = new JCheckBox("Bold"); 
     check2 = new JCheckBox("Italics"); 

     label1 = new JLabel("Text : "); 
     label2 = new JLabel("Style : "); 
     message = "Good Morning..."; 
     text1 = new JTextField(message, 100); 
     font = new Font("Times New Roman", Font.PLAIN, 36); 
     setBounds(0, 0, 600, 300); 

     JPanel panel = new JPanel(); 
     panel.setLayout(null); 
     panel.setBounds(0, 0, 600, 120); 
     panel.setBackground(Color.ORANGE); 
     label1.setFont(new Font("Times New Roman", Font.PLAIN, 36)); 
     label1.setBounds(15, 15, 100, 36); 
     panel.add(label1); 
     text1.setBounds(120, 15, 400, 36); 
     panel.add(text1); 

     label2.setFont(new Font("Times New Roman", Font.PLAIN, 36)); 
     label2.setBounds(15, 65, 100, 36); 
     panel.add(label2); 
     check1.setBounds(120, 65, 100, 36); 
     check2.setBounds(220, 65, 100, 36); 
     panel.add(check1); 
     panel.add(check2); 

     check1.addActionListener(new CheckBoxListener()); 
     check2.addActionListener(new CheckBoxListener()); 
     text1.addActionListener(new TextFieldListener()); 

     setLayout(null); 
     add(panel); 
    } 
    public void paint(Graphics g) 
    { 
     super.paint(g); 

     g.setFont(font); 
     g.drawString(message, 15, 255); 

    } 
    private class CheckBoxListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      if(check1.isSelected() && check2.isSelected()) 
      { 
       font = new Font("Times New Roman", Font.BOLD + Font.ITALIC, 36);  
       repaint(); 
      } 
      else if(check1.isSelected()) 
      { 
       font = new Font("Times New Roman", Font.BOLD, 36); 
       repaint(); 
      } 
      else if(check2.isSelected()) 
      { 
       font = new Font("Times New Roman", Font.ITALIC, 36); 
       repaint(); 
      } 
      else 
      { 
       font = new Font("Times New Roman", Font.PLAIN, 36); 
       repaint(); 
      } 
     } 
    } 
    private class TextFieldListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      message = text1.getText(); 
      repaint(); 
     } 
    } 
    public static void main(String[] args) 
    { 
     JFrame frame = new MyProgram01("My Program 01"); 
     frame.setVisible(true); 
     frame.setResizable(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
}  

表示を即時に更新するようにコードを変更するにはどうすればよいですか?

EDIT:

それはのKeyListenerとの仕事だが、2番目のキーが押された後、私のプログラムだけ表示を開始します。例えば

、I abcでキー、プログラムは私がbを押したときにaを示し、私はcを押したときに私はENTERを押さない限り、それは、abcが欠落している表示を開始します。

ここでは、コードの一部:

text1.addKeyListener(new KeyAdapter() 
    { 
      public void keyPressed(KeyEvent e) 
      { 
       message = text1.getText(); 
       repaint(); 
      } 
    }); 
+0

keyPressed(KeyEvent e)でkeyTyped(KeyEvent e)を試してみてください。 – Vinesh

+0

'keyPressed'を' keyTyped'に置き換えることを意味しますか? – Chin

答えて

3

は、あなたのテキストフィールドにKeyListenerを追加します。 あなたはこのようにそれを行うことができます。

textField.addKeyListener(new KeyAdapter(){ 
    @Override 
    public void keyPressed(KeyEvent e){ 
     message = textField.getText(); 
     repaint(); 
    } 
});  

OR

は、あなたのテキストフィールドのDocumentからDocumentListenerを追加します。

private JFrame getFrame(){ 
    return this; 
} 
... 

textField.getDocument().addDocumentListener(new DocumentListener(){ 

    @Override 
    public void insertUpdate(DocumentEvent e) { 
     message = textField.getText(); 
     getFrame().repaint(); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     message = textField.getText(); 
     getFrame().repaint(); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     // on change 
    } 

}); 
+0

私はこの答えをKeyListenerよりもお勧めします。 KeyListenersでは、使用するかどうかにかかわらず、すべてのメソッドを実装する必要があり、コードが乱雑になります。アダプタを使用するときは、super.keyPressed(e)を呼び出すことを忘れないでください。 –

2

代わりにクラスTextFieldListenerのためにActionListenerを使用しての、のKeyListenerインタフェースを使用し、keyTypedに(のKeyEvent e)のメソッドを使用します。 あなたはこのようにそれを行うことができます。イベントが発生すると、texfieldのgetText()を使用して再描画できます。

関連する問題