Java 通过选择jcheckbox添加jpanel

Java 通过选择jcheckbox添加jpanel,java,swing,jpanel,jcheckbox,netbeans-8,Java,Swing,Jpanel,Jcheckbox,Netbeans 8,正如您从布局中看到的,我想通过选择复选框来添加(或显示)jPanelspanelWindow包含在jScrollPane中 + checkBox1 | jPanel1 | ------------------------------------- + checkBox2 | jPanel2 | ------------------------------------- + checkBox3 | jPanel3

正如您从布局中看到的,我想通过选择
复选框来添加(或显示)
jPanels
panelWindow
包含在
jScrollPane

 + checkBox1  |            jPanel1  |
-------------------------------------
 + checkBox2  |            jPanel2  |
-------------------------------------
 + checkBox3  |            jPanel3  |
-------------------------------------
      ^                       ^
      |                       |
 checkBoxPanel            panelWindow
在选择
checkBox2
checkBox3
的情况下,
panelWindow
显示
jPanel2
jPanel3
,因此
jPanel1
的位置将被
jPanel2
替换,而
jPanel2
的位置将被
jPanel3
替换

 + checkBox2  |            jPanel2  |
-------------------------------------
 + checkBox3  |            jPanel3  |
------------------------------------- 
      ^                       ^
      |                       |
 checkBoxPanel            panelWindow
现在我不知道如何实现这个目标。我尝试使用CardLayout,但在这种情况下,
panelWindow
只切换
jPanels

我想要实现的目标是选择几个
复选框
panelWindow
中显示所选的
jpanel
。如果未选中任何
复选框
,则
面板窗口
为空


提前感谢。

创建配对列表复选框/面板。将所有对添加到容器中,但使面板不可见。根据复选框的状态,为每个复选框添加一个侦听器以显示/隐藏面板。

根据@StanislavL的建议,我在
jcheckbox
JPanel
之间创建了一个
Map
,使用
itemstener
来显示和隐藏面板

public class PanelShower extends JFrame {

    Map<JCheckBox, JPanel> boxPanelMap = new HashMap<>();
    final int size = 5;

    public PanelShower() {

        JPanel boxesPanel = new JPanel();
        boxesPanel.setLayout(new BoxLayout(boxesPanel, BoxLayout.PAGE_AXIS));

        JPanel panelsPanel = new JPanel();
        panelsPanel.setLayout(new BoxLayout(panelsPanel, BoxLayout.PAGE_AXIS));

        for (int i = 0; i < size; i++) {
            JCheckBox checkBox = new JCheckBox("Box " + i);
            checkBox.addItemListener(new SelectionListener());
            boxesPanel.add(checkBox);

            JPanel panel = new JPanel();
            panel.setPreferredSize(new Dimension(200, 75));
            panel.setBackground(new Color( (int) (Math.random() * (Math.pow(2, 24) - 1) ) ));
            panel.add(new JLabel("Panel " + i));
            panel.setVisible(false);
            panelsPanel.add(panel);

            boxPanelMap.put(checkBox, panel);
        }

        getContentPane().add(boxesPanel, BorderLayout.LINE_START);
        getContentPane().add(panelsPanel, BorderLayout.CENTER);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private class SelectionListener implements ItemListener {

        @Override
        public void itemStateChanged(ItemEvent e) {

            (boxPanelMap.get(e.getSource())).setVisible(e.getStateChange() == ItemEvent.SELECTED);
            pack();
        }
    }

    public static void main(String args[]) {

        new PanelShower();
    }
}

我想我遗漏了什么。您希望jPanel1被jPanel2替换。。。但在这种情况下,支票箱1在哪里?如何将jPanel1设置为再次显示?发布相关代码(似乎除了功能外,布局已排序),以便我们在回答中与之相关。
private class SelectionListener implements ItemListener {

    JCheckBox checkBox;

    SelectionListener(JCheckBox checkBox) {

        this.checkBox = checkBox;
    }

    @Override
    public void itemStateChanged(ItemEvent e) {

        (boxPanelMap.get(checkBox)).setVisible(e.getStateChange() == ItemEvent.SELECTED);
        pack();
    }
}