gpt4 book ai didi

java - 关于 PropertyChangeListener 的推理正确吗?

转载 作者:行者123 更新时间:2023-12-01 13:49:46 25 4
gpt4 key购买 nike

我对 PropertyChangeListener 接口(interface)的使用有一些疑问。

我有一个名为 GUI 的类,它实现了 PropertyChangeListener 接口(interface)。

在这个类中,我有以下方法来创建和显示 JFrame (LoginFrame 是扩展 JFrame 的自定义类):

private void showLoginFrame() {
loginFrame = new LoginFrame();
loginFrame.setVisible(true);
loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Notify every change to every bound property for that object:
loginFrame.addPropertyChangeListener(this);
}

因此,在我的 LoginFrame 对象上,我添加了一个 PropertyChangeListener。因此,我认为我正在添加一种机制,当更改此对象中的属性值时,它会通知此更改,该更改将由以下方法处理(在我的 GUI 类中声明):

@Override
public void propertyChange(PropertyChangeEvent arg0) {
System.out.println("GUI SingleFrameApplication ---> propertyChange(): " + arg0.getPropertyName());

if (arg0.getPropertyName().equals("buttonLogOffClicked")) {
//System.out.println("GUI SingleFrameApplication ---> richiamo exit");
//exit();

mainFrame.OnWindowClose();
mainFrame.dispose();
mainFrame = null;

showLoginFrame();
}

if (arg0.getPropertyName().equals("loginResult")) {
System.out.println("GUI SingleFrameApplication ---> richiamo MainFrame");
//loginFrame.setVisible(false);
loginFrame.dispose();
loginFrame = null;

showMainFrame();
}

}

在我的 LoginFrame 类中的特定情况下,我有一个 JButton,如果单击它,则会触发将由前面的方法处理的事件,如下所示:

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Button LogIn cliccked");

// this.addPropertyChangeListener(listener); // I add the PropertyChange Listener to this LoginFrame object

// I fire a PropertyChange: the event start and will be handled by the propper propertyChange() method definied in the listener class:

firePropertyChange("loginResult", false, loginResult);

}

我的推理正确吗?

谢谢

安德里亚

最佳答案

  1. 与其直接从 Action 执行的函数触发属性更改,不如扩展目标 bean 类,定义一个 setXXX() 方法来更改 xxx property。所有Java bean 都结合了getXXX()setXXX() 方法来获取和设置它们的Property xxxxsetXXX() 是更改属性的函数。我们应该触发该属性,在更改属性后,在上下文中我们正在更改它,因此它是 setXXX() 方法。我们来看看 Component 类的 setPreferredSize(Dimesion) 方法源码:

     public void setPreferredSize(Dimension preferredSize) {

    if (prefSizeSet) {
    old = this.prefSize;
    }
    else {
    old = null;
    }
    this.prefSize = preferredSize;
    prefSizeSet = (preferredSize != null);
    firePropertyChange("preferredSize", old, preferredSize);
    }

    看,我们在更改具有相应属性名称的属性时触发该属性。优点是它增加了更好的清晰度并使代码结构更具可读性。

  2. 我不想在监听时对每个属性进行条件检查,而是使用:addPropertyChangeListener("aProperty", PropertyChangeListener)方法:它将监听由定义的特定属性更改代替“aProperty”

  3. 正如下面 @Hovercraft 所建议的,属性名称是一个公共(public)字符串常量,以免遇到拼写或大小写问题。

关于java - 关于 PropertyChangeListener 的推理正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com