Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通知对象有关事件的信息_Java_Events_Propertychangelistener - Fatal编程技术网

Java 通知对象有关事件的信息

Java 通知对象有关事件的信息,java,events,propertychangelistener,Java,Events,Propertychangelistener,我正在寻找一种有效的方法,在对关键对象进行更改后触发一组对象的更改。我想做的是: 有一个对象,如果更改,将在其他对象中执行方法 我试图使用PropertyChangeListener来完成以下任务: import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.Pr

我正在寻找一种有效的方法,在对关键对象进行更改后触发一组对象的更改。我想做的是: 有一个对象,如果更改,将在其他对象中执行方法

我试图使用PropertyChangeListener来完成以下任务:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BoundSample {
    public static void main(String args[]) {
        JFrame frame = new JFrame("PropertyChangeListener Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JButton button1 = new JButton("Open");
        final JButton button2 = new JButton("Cancel");

        final String[] languages = { "English", "Spanish" };

        final JComboBox combo = new JComboBox(languages);

        final JPanel panel = new JPanel();


        ActionListener actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                JComboBox comboTmp = (JComboBox) actionEvent.getSource();

                if (combo.getSelectedItem().equals("English") || combo.getSelectedItem().equals("Ingles")) {
                    String[] langs = { "English", "Spanish" };
                    comboTmp.setModel(new JComboBox(langs).getModel());
                }
                else if (combo.getSelectedItem().equals("Spanish") || combo.getSelectedItem().equals("Espanol")) {
                    String[] langs = { "Ingles", "Espanol" };
                    comboTmp.setModel(new JComboBox(langs).getModel());
                }
            }
        };

        PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
                String property = propertyChangeEvent.getPropertyName();

                JComboBox comboTmp = (JComboBox) propertyChangeEvent.getSource();
                String language = (String) comboTmp.getItemAt(0);

                System.out.println(language);

                if ("model".equals(property)) {
                    if (language.equals("English")) {
                        button1.setLabel("Open");
                        button2.setLabel("Cancel");
                    } else if (language.equals("Ingles")) {
                        button1.setLabel("Abierto");
                        button2.setLabel("Cancelar");
                    }

                }
            }
        };

        combo.addPropertyChangeListener(propertyChangeListener);
        combo.addActionListener(actionListener);

        Container contentPane = frame.getContentPane();
        panel.add(button1, BorderLayout.CENTER);
        panel.add(button2, BorderLayout.SOUTH);

        contentPane.add(combo, BorderLayout.NORTH);
        contentPane.add(panel, BorderLayout.SOUTH);

        frame.setSize(300, 100);
        frame.setVisible(true);
    }
}
这种方法的问题是,随着对象数量的不断增加,propertyChange()方法将不断扩展,并且将变得难以管理。此外,要添加新的JComponent,我还必须修改propertyChange()

有没有一种方法可以通过使对象“查找”键对象中的更改,从而使它们相应地进行操作,而不是通过在键对象的PropertyChangeListener中执行操作来对其进行操作,从而实现相反的效果?或者是其他简单的方法?你知道答案吗?它实现了您想要的功能:对象将在对象上注册,以便在发生某些事情时得到通知

你知道那条路吗?它实现了您想要的功能:对象将在对象上注册,以便在发生某些事情时得到通知


首先,一个建议-总是让母语为英语的人来翻译。它有助于避免某些类型的错误。例如,您选择的“打开”替换词通常用作形容词(如“打开的窗口”),而不是动词,而您使用的是“取消”的非限定时态。你也没有重音符号,这可能会让一些读者感到困惑(有些单词只是因为重音符号不同…)

其次,你不应该硬编码语言的选择或使用;它们应该从
.properties
文件或类似文件中加载。这使得维护变得微不足道,尤其是在添加其他语言时@Mort关于使用observer模式的回答是正确的——这就是应该如何处理更新。下面是(大致)如何处理语言方面的问题:
首先,您需要一些
.properties
文件

spanishButtonNames.properties
==================================
openButton=Abrir
cancelButton=Cancelar

englishButtonNames.properties
==================================
opernButton=Open
cancelButton=Cancel
您需要将它们封装在某种
PropertyManager
中,当需要该语言时,它将处理在后台加载资源文件的问题(可能还需要释放资源)

接下来,在创建按钮时,将其命名为:

JButton openButton = new JButton();
openButton.setName("openButton");
// And add them to a list
buttonList.add(openButton);
// More buttons....
因此,从按钮列表中更新按钮并不重要。您可以只使用
按钮列表
侦听(并传播)更新:

for(JButton button : buttonList) {
    button.setText(languagePropertyManager.getProperty(button.getName()));
}

(请注意,通过一些巧妙的编码,甚至可以从文本文件加载GUI布局,但我从未尝试过。不过,我相信有一些框架可以处理这个问题。)

首先,一个建议-始终让母语为英语的人来翻译。它有助于避免某些类型的错误。例如,您选择的“打开”替换词通常用作形容词(如“打开的窗口”),而不是动词,而您使用的是“取消”的非限定时态。你也没有重音符号,这可能会让一些读者感到困惑(有些单词只是因为重音符号不同…)

其次,你不应该硬编码语言的选择或使用;它们应该从
.properties
文件或类似文件中加载。这使得维护变得微不足道,尤其是在添加其他语言时@Mort关于使用observer模式的回答是正确的——这就是应该如何处理更新。下面是(大致)如何处理语言方面的问题:
首先,您需要一些
.properties
文件

spanishButtonNames.properties
==================================
openButton=Abrir
cancelButton=Cancelar

englishButtonNames.properties
==================================
opernButton=Open
cancelButton=Cancel
您需要将它们封装在某种
PropertyManager
中,当需要该语言时,它将处理在后台加载资源文件的问题(可能还需要释放资源)

接下来,在创建按钮时,将其命名为:

JButton openButton = new JButton();
openButton.setName("openButton");
// And add them to a list
buttonList.add(openButton);
// More buttons....
因此,从按钮列表中更新按钮并不重要。您可以只使用
按钮列表
侦听(并传播)更新:

for(JButton button : buttonList) {
    button.setText(languagePropertyManager.getProperty(button.getName()));
}

(注意,通过一些巧妙的编码,甚至可以从文本文件加载GUI布局,但我从未尝试过。不过,我相信有一些框架可以处理这个问题。)

有一些绑定框架接管了样板文件的连接,f.i.BetterBeansBinding或JGoodies绑定有一些绑定框架,它们接管了样板布线、f.i.BetterBeansBinding或JGoodies绑定