有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JCheckBox设置其他类中的值

你好,我有类似的东西

public class GUI{
    public JCheckBox box;
    public boolean value;

    void init(){
        box.addActionListener(new BoxListener(this));
    }
}

public class BoxListener implements ActionListener{
    GUI gui;
    public BoxListener(GUI gui){
         this.gui = gui;
    }

    @override
    public void actionperformed(ActionEvent a){
         gui.value = true; 
    }

}

现在我想在单击复选框时更改bool的值。 我正在寻找更好的解决方案,而不是将类GUI作为自编侦听器的输入参数

有没有更好的解决办法


共 (2) 个答案

  1. # 1 楼答案

    我们为什么不把你的东西稍微修改一下呢:

    首先,创建一个控制器DefaultController)类,该类将处理初始化应用程序并保存对GUI的引用(或视图

    public class DefaultController
    {
        private final GUI view = new GUI(); // The view
    
        private void init()
        {
            // ...
    
            this.view.addBoxListener(new BoxListener(this.view));
    
            // ...
        }
    
        public static void main(String[] args)
        {
            // ... Start up code ...
        }
    }
    

    接下来,修改GUI类以包含与JCheckBox交互的方法,并注册一个侦听器:

    public class GUI
    {
        private JCheckBox box;
    
        // ...
    
        public void addBoxListener(ItemListener listener)
        {
            box.addItemListener(listener);
        }
    
        public void setBoxValue(boolean selected)
        {
            box.setSelected(selected);
        }
    
        // ...
    }
    

    现在BoxListener有了视图的实例(GUI),可以通过提供的接口调用来设置复选框的值。您不再直接访问box成员变量(封装)。这将允许您在不影响调用者的情况下对setBoxValue方法进行更改

    在你的BoxListener课上:

    @Override
    public void itemStateChanged(ItemEvent evt)
    {
        view.setBoxValue(true); // For example...
    }
    

    注:viewBoxListener-private GUI view;的成员变量

  2. # 2 楼答案

    我会加入一些MVC,这需要做更多的工作,但它有助于更灵活的编码

    首先是一个ModelBean和一个boolean checkedpropertyChangeSupport用于触发属性更改事件

    import java.beans.*;
    import java.io.Serializable;
    
    public class ModelBean implements Serializable {
    
        private boolean checked;
    
        private PropertyChangeSupport propertySupport;
    
        public ModelBean() {
            propertySupport = new PropertyChangeSupport(this);
        }
    
        public boolean getChecked() {
            return checked;
        }
    
        public void setChecked(boolean checked) {
            boolean oldValue = this.checked;
            this.checked = checked;
            propertySupport.firePropertyChange("checked", oldValue, this.checked);
        }
    
        public void addPropertyChangeListener(PropertyChangeListener listener) {
            propertySupport.addPropertyChangeListener(listener);
        }
    
        public void removePropertyChangeListener(PropertyChangeListener listener) {
            propertySupport.removePropertyChangeListener(listener);
        }  
    }
    

    然后你就有了主GUI类,它将ModelBean作为参数

    class GUI extends JFrame {
        private ModelBean model;
        private JCheckBox cbox;
    
        public GUI(ModelBean model) {
            this.model = model;
            cbox = new JCheckBox("Check and watch me print");
            cbox.addItemListener(new CheckListener(model));
    
            setLayout(new GridBagLayout());
            add(cbox);
            setSize(300, 300);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);
        }
    }
    

    而您ItemListener类,它将相同的ModelBean作为参数,并将PropertyChangeListener添加到model

    class CheckListener implements ItemListener {
    
        private ModelBean model;
    
        public CheckListener(ModelBean newModel) {
            this.model = newModel;
            model.addPropertyChangeListener(new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent e) {
                    System.out.println(model.getChecked());
                }
            });
        }
    
        @Override
        public void itemStateChanged(ItemEvent e) {
            JCheckBox source = (JCheckBox) e.getSource();
            if (source.isSelected()) {
                model.setChecked(true);
            } else {
                model.setChecked(false);
            }
        }
    }
    

    然后你去运行这个程序

    public class TestMVC {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    final ModelBean model = new ModelBean();
                    GUI gui = new GUI(model);
                }
            });
        }
    }
    

    对于一个愚蠢的boolean来说,这似乎是一个很大的工作,但这个概念是一个更好的整体设计,适用于需要操纵和听取大量不同数据以进行更改的大型程序


    更新

    另一个选项是,如果您的GUI是父容器,并且您不想通过引用传递来公开它,那么您可以创建一个interface并让GUI实现它

    public interface BooleanInterface {
        public void setBoolean(boolean bool);
    }
    
    public class GUI extends JFrame implements BooleanInterface {
        boolean bool;
    
        @Override
        public void setBoolean(boolean bool) {
            this.bool = bool;
        }
    }
    
    public BoxListener implements ActionListener {
        BooleanInterface boolFace;
    
        public BoxListener(BooleanInterface boolFace) {
            this.boolFace = boolFace;
        }
    }
    

    然后可以将GUI传递给侦听器。虽然它看起来和你已经在做的事情一样,但实际上它并不是,因为它不再公开^{,而是使用接口