【问题标题】:How to get instantly update from the textfield?如何从文本字段中获取即时更新?
【发布时间】:2012-05-09 14:15:16
【问题描述】:

我想更改文本字段中的输入,它会立即更新到显示,而不是按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);
    }
}    

如何更改代码以立即更新到显示?

编辑:

它与 keyListener 一起工作,但我的程序只有在按下第二个键后才会开始显示。

例如,我输入abc,当我按下b时程序将开始显示a,当我按下c时,它显示ab和c缺失,除非我按ENTER。

这里是部分代码:

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

【问题讨论】:

  • 尝试使用 keyTyped(KeyEvent e) 而不是 keyPressed(KeyEvent e)。
  • 你的意思是把keyPressed换成keyTyped吗?

标签: java


【解决方案1】:

在您的文本字段中添加KeyListener。 你可以这样做:

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

或

将DocumentListener 添加到您的文本字段的Document。 你可以这样做:

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
    }

});

【讨论】:

  • 我推荐这个答案而不是 KeyListener 一个。对于 KeyListeners,无论您是否要使用它们,您都必须实现所有方法,这会使您的代码变得混乱。只要记住在使用适配器时调用 super.keyPressed(e) 即可。
【解决方案2】:

对于 TextFieldListener 类不要使用 ActionListener,而是使用 KeyListener 接口并使用 keyTyped(KeyEvent e) 方法。当事件发生时,您可以使用 texfield 的 getText() 并重新绘制它。

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多