有 Java 编程相关的问题?

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

java向JCheckBox的ArrayList添加ItemListeners

我对ItemListeners有问题。基本上,我想查询数据库以获得一些数据,并按照DAO模式将它们放入对象中。问题是,当我把ArrayList放在CheakBoxes中时,我不知道如何向它们添加侦听器

在通过循环将它们放入容器之前,我尝试添加ItemListener。我还尝试在将ItemListeners添加到容器后添加它们,但也没有效果

我只测试了1个chekBox的脚本,效果很好。说到ArrayList,我有一条错误消息:无法引用在封闭范围中定义的非最终局部变量jCheckBox

下面的代码是另一个测试,只是为了看看我的程序是否有错误,但在将侦听器添加到ArrayList对象时,它似乎给了我同样的问题

package test;
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {
private static ArrayList<JCheckBox> jCheckBoxs;
private static JFrame jFrame=new JFrame();

public static void main(String[] args) {
    init();
}
private static void init() {

    jFrame.setSize(new Dimension(400,400));
    jFrame.setTitle("test");

    JPanel jp=new JPanel();
    jCheckBoxs=new ArrayList<JCheckBox>();
    addArray("A");
    addArray("B");
    addArray("C");
    jp.add(jCheckBoxs.get(0));

    jp.add(jCheckBoxs.get(1));

    jp.add(jCheckBoxs.get(2));

    jFrame.getContentPane().add(jp);
    jFrame.setVisible(true);
}
private static void addArray(String msg) {
    JCheckBox jCheckBox=new JCheckBox();
    jCheckBox.setText(msg);
    jCheckBox.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent e) {
            System.out.println(jCheckBox.getName());
        }
    });
}
}

共 (1) 个答案

  1. # 1 楼答案

    • 如果要在匿名内部类中引用局部变量,正如在许多类似问题中所讨论的那样,需要将局部变量final
    • 您没有将JCheckbox添加到ArrayList或GUI中,因此您的代码毫无意义
    • 不要使用绝对ArrayList索引,因为这是在请求异常。在上面的代码中,ArrayList大小为0,因此此代码将导致索引越界异常
    • 大多数代码都不应该是静态的。使用实例字段和实例方法。只有主方法应该是静态的

    例如:

    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.*;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class MultCheckBoxes extends JPanel {
        private List<JCheckBox> checkBoxes = new ArrayList<>();
        private JTextArea showSelectionTArea = new JTextArea(25, 50);
        private JPanel checkBoxPanel = new JPanel(new GridLayout(0, 1));
        private ItemListener myItemListener = new MyItemListener();
    
        public MultCheckBoxes() {
            showSelectionTArea.setFocusable(false); // so user can't enter text
    
            JPanel wrapperPanel = new JPanel(new BorderLayout());
            wrapperPanel.add(checkBoxPanel, BorderLayout.PAGE_START);
    
            JPanel bottomPanel = new JPanel();
            bottomPanel.add(new JButton(new GetAllStatesAction()));
    
            setLayout(new BorderLayout());
            add(new JScrollPane(showSelectionTArea));
            add(wrapperPanel, BorderLayout.LINE_END);
            add(bottomPanel, BorderLayout.PAGE_END);
        }
    
        public void addCheckBox(String name) {
            JCheckBox checkBox = new JCheckBox(name);
            checkBox.addItemListener(myItemListener);
            checkBoxes.add(checkBox);
            checkBoxPanel.add(checkBox);
            revalidate();
            repaint();
        }
    
        private class MyItemListener implements ItemListener {
    
            @Override
            public void itemStateChanged(ItemEvent itemEvt) {
                // The ItemEvent object will give us the JCheckBox that was changed
                JCheckBox checkBox = (JCheckBox) itemEvt.getSource();
    
                // get its text and its state
                String text = checkBox.getText();
                String select = itemEvt.getStateChange() == ItemEvent.SELECTED ? "selected" : "unselected";
    
                // display this in the JTextArea
                showSelectionTArea.append(text + ": " + select + "\n");
            }        
        }
    
        private class GetAllStatesAction extends AbstractAction {
            public GetAllStatesAction() {
                super("Get All CheckBox States"); // button's text
                putValue(MNEMONIC_KEY, KeyEvent.VK_A); // mnemonic key
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                showSelectionTArea.append("\n");
                showSelectionTArea.append("All CheckBox States: \n");
                for (JCheckBox jCheckBox : checkBoxes) {
                    String text = jCheckBox.getText();
                    String select = jCheckBox.isSelected() ? "selected" : "unselected";
    
                    showSelectionTArea.append(text + ": " + select + "\n");
                }
                showSelectionTArea.append("\n");
            }
        }
    
        private static void createAndShowGui() {
            MultCheckBoxes mainPanel = new MultCheckBoxes();
            mainPanel.addCheckBox("Box A");
            mainPanel.addCheckBox("Box B");
            mainPanel.addCheckBox("Box C");
            mainPanel.addCheckBox("Box D");
            mainPanel.addCheckBox("Box E");
    
            JFrame frame = new JFrame("MultCheckBoxes");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }