Java - 监听变量变化

标签 java global-variables actionlistener

首先,我是 Java 的新手:/

我已经尝试自己解决这个问题大约 2 天了,但无法解决这个问题,问题是我正在尝试实现一个变量更改监听器。我曾尝试在我的项目中实现 Observer 和 Observable,但没有成功,但充其量也没有成功,我想出了将代码的一些元素包装到 while 循环中的方法,但失败了。

这是我的类(class),如果你看一下它,我在构造函数之后定义了一些全局变量,我需要监听所有这些全局变量的变化,如果有变化我想执行一个方法。

有人告诉我 JavaFX 有可以监听变量的方法,有人可以证实这一点吗? 无论如何,提前感谢您的帮助。

public class Tower_Controller {

    public Tower_Controller() {
    }

    //Global variables
    String isSelected = null;
    int hasModules = 0;
    int cap_s = 0;
    int cpu_s = 0;
    int cap = 0;
    int cpu = 0;
    int shield = 0;
    int armor = 0;
    double em = 00.00;
    double th = 00.00;
    double ki = 00.00;
    double ex = 00.00;


    public void invoke() {
        Invoke_GUI runnable = new Invoke_GUI();
        final JLabel tower_name = runnable.tower_name;
        final JComboBox tower_select = runnable.tower_select;
        final JTree module_browser = runnable.module_browser;
        final JTree selected_modules = runnable.selected_modules;

        final JProgressBar cap_bar = runnable.cap_bar;
        final JProgressBar cpu_bar = runnable.cpu_bar;

        final JLabel em_res = runnable.em;
        final JLabel th_res = runnable.thermic;
        final JLabel ki_res = runnable.kinetic;
        final JLabel ex_res = runnable.explosive;

        tower_select.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (isSelected != null) {
                    Events evt = new Events();
                    evt.towerSelected(isSelected);
                } else {
                    tower_name.setText(tower_select.getSelectedItem().toString());
                    isSelected = tower_name.toString();
                }
            }
        });

        removeTower(tower_name);
        runnable.setVisible(true);

    }



    public void updateValues(final JProgressBar cap_bar, final JProgressBar cpu_bar, final JLabel em_res,
        final JLabel th_res, final JLabel ki_res, final JLabel ex_res){

        cap_bar.setMaximum(cap);
        cap_bar.setString(cap_s + " / " + cap);
        cap_bar.setStringPainted(true);

        cpu_bar.setMaximum(cpu);
        cpu_bar.setString(cpu_s + " / " + cpu);
        cpu_bar.setStringPainted(true);

        String em_v = String.valueOf(em); 
        em_res.setText(em_v);

        String th_v = String.valueOf(th); 
        th_res.setText(th_v);

        String ki_v = String.valueOf(ki); 
        ki_res.setText(ki_v);

        String ex_v = String.valueOf(ex); 
        ex_res.setText(ex_v);
    }

    public void updateList(final ArrayList<String> nodes, final JTree selected_modules) {
        DefaultMutableTreeNode nod = new DefaultMutableTreeNode();
        for (int i = 0; i < nodes.size(); i++) {
            nod.add(new DefaultMutableTreeNode(nodes.get(i)));
        }
        selected_modules.setModel(new DefaultTreeModel(nod));
    }

    public void removeTower(final JLabel tower_name) {
        tower_name.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                if (hasModules == 1 & isSelected != null) {
                    Events evt = new Events();
                    evt.towerHasModules();
                } else if (isSelected == null) {
                } else {
                    tower_name.setText("No Control Tower selected");
                    isSelected = null;
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });
    }

    public JLabel setTowerName(JLabel a, String name) {
        a.setText(name);
        return a;
    }




}

最佳答案

通知变量更改的一般过程如下:

  1. 首先,将变量设为私有(private)。
  2. 为每个变量创建两个方法,一个将它的值设置为一个参数(通常称为 setX(),其中 X 是变量名),另一个检索它的值 (getX())
  3. 在任何需要读取或设置变量的地方,调用方法。
  4. setX() 方法中,循环调用 Observer 上的 notifyObserver()

好了!现在每次更改变量时,都会通知已注册的 Observer。该解决方案的关键部分是变量必须是私有(private)的,因此没有代码可以在不通过 setX() 方法的情况下设置它们的值。

关于Java - 监听变量变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514907/

相关文章:

java - 无法从内部类访问封闭类的 JPasswordField 对象

java - 使用2个JComboBoxes做不同的数学方程,java

java - 如何禁用 JTextArea Swing 上的文本选择

java - 如何为少数测试类而不是所有测试类运行 cobertura 代码覆盖率?

java - Sharedpreferences 保存 arraylist<integer> 在发布版本中具有双值

java - 当观察者需要不同的参数更新时,观察者设计模式中该怎么做

dictionary - 在 Ocaml 中映射为全局变量

c++ - 为什么将全局变量和静态变量初始化为其默认值?

python - 如何使局部变量(函数内部)成为全局变量

java - 将参数传递给 JButton ActionListener