当前位置: 首页 > 面试题库 >

通过PropertyChangeListener同步JTextFields值

苏星宇
2023-03-14
问题内容

我想在TXTFLD1的值更改时将a的值复制jTextField - TXTFLD1到另一个jTextField -TXTFLD2
propertychangelistener之所以选择,是因为我无法检测到TXTFLD1上的值何时更改,因为它已被某些我现在无法修改的外部代码更改。

测试代码如下:

public class TxtFldSync extends JFrame {
    private JButton BTN1 = null;
    private JTextField TXTFLD1 = null;
    private JTextField TXTFLD2 = null;

    public static void main(String[] args) {
            TxtFldSync thisClass = new TxtFldSync();
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            thisClass.setVisible(true);
    }
    public TxtFldSync() {
        super();
        this.setSize(300, 200);
        BTN1 = new JButton();
        BTN1.setBounds(new Rectangle(178, 38, 67, 17));
        TXTFLD1 = new JTextField();
        TXTFLD1.setBounds(new Rectangle(32, 42, 83, 20));

        TXTFLD2 = new JTextField();
        TXTFLD2.setBounds(new Rectangle(30, 78, 83, 20));

        //listeners
        TXTFLD1.addPropertyChangeListener("value", new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent arg0) {
                TXTFLD2.setText(TXTFLD1.getText()+"set by change listener");
                //this doesnot work why ?
            }
        });
        BTN1.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                TXTFLD1.setText("Action Performed");
                //i what to set same value to TXTFLD2 using property change listener
            }
        });

        this.setContentPane(new Container());
        this.getContentPane().add(BTN1);
        this.getContentPane().add(TXTFLD1);
        this.getContentPane().add(TXTFLD2);
    }
}

为什么属性更改侦听器不起作用。这个问题还有哪些其他替代解决方案?


问题答案:

例如,如StanislavL +1所示,建议使用DocumentListener

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TextLabelMirror {

    private JPanel mainPanel = new JPanel();
    private JTextField field = new JTextField(20);
    private JTextField field1 = new JTextField(20);

    public TextLabelMirror() {
        field.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void changedUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            private void updateLabel(DocumentEvent e) {
                java.awt.EventQueue.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        field1.setText(field.getText());
                    }
                });
            }
        });

        mainPanel.setLayout(new GridLayout(1, 0, 10, 0));
        mainPanel.add(field);
        mainPanel.add(field1);
    }

    public JComponent getComponent() {
        return mainPanel;
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("TextLabelMirror");
        frame.getContentPane().add(new TextLabelMirror().getComponent());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}


 类似资料:
  • 问题内容: 我试图弄清楚如何在另一个类中侦听属性更改。下面是我的代码: ClassWithProperty具有我想听的属性: 主要是我需要了解属性更改的地方: 我只有最后一次触发该事件(usersOnline = 10)。我是Java新手,并试图找到解决方案,但无济于事。 问题答案: 代码: 返回表示“无对象”,这反过来意味着有效 ,不会注册任何内容。 您必须将有效的a实例传递给方法。 编辑 我建

  • 我有一个程序,它的函数将指针作为arg和main。main正在创建n个线程,每个线程根据传递的在不同的内存区域上运行该函数。然后加入线程,main在区域之间执行一些数据混合并创建n个新线程,这些线程执行与旧线程相同的操作。 为了改进程序,我想让线程保持活动状态,消除创建它们所需的长时间。线程应该在主线程工作时Hibernate,并在它们必须再次出现时通知。同样,当线程工作时,主线程应该等待,就像连

  • 我一直在读java中的同步,我有一个问题。我看到的例子是,一个类在一个本地对象上创建一个同步块。或者一个同步的方法。这两个都不适合我的情况。所以我有一个类的静态实例,它保存了整个应用程序的所有数据。该类上的变量被创建为“private”,我创建了getter来检索这些值。其中一些值一次只需要一个线程从应用程序中的不同类访问。由于它们被创建为private,所以我使用同步块,如下所示。。。 我可以通

  • 编辑:如果不是线程安全的,我正在寻找一个关于竞争条件的描述,这样我就可以更好地理解潜在的问题并填补知识空白。

  • 问题内容: 到目前为止,我已经看到了同步块的用法,但是最近我了解到最好使用伪对象。我发现以下与此相关的主题。 Java同步方法锁定对象还是方法? 作为总结,在下面的代码中,两个不同的对象不能同时运行addA和addB,因为两者都使用此方法进行锁定。 如果我将虚拟对象用于锁定,我会感到困惑,如果在两种方法中使用下面的行进行同步,会有什么不同?因为它们仍然具有相同的锁。 那么,对于每个与sycnhro

  • 我们使用通道来同步协程之间的执行。 下面的例子是通过获取同步通道数据来阻塞程序执行的方法来等待另一个协程运行结束的。 也就是说main函数所在的协程在运行到<-done语句的时候将一直等待worker函数所在的协程执行完成,向通道写入数据才会(从通道获得数据)继续执行。 package main import "fmt" import "time" // 这个worker函数将以协程的方式运行 /