通过选择 jCheckBoxes 添加 jPanel

add jPanels by selecting jCheckBoxes

正如您从布局中看到的那样,我想通过选择 checkBoxes 添加(或显示)jPanelspanelWindow 包含在 jScrollPane.

 + checkBox1  |            jPanel1  |
-------------------------------------
 + checkBox2  |            jPanel2  |
-------------------------------------
 + checkBox3  |            jPanel3  |
-------------------------------------
      ^                       ^
      |                       |
 checkBoxPanel            panelWindow

在选择checkBox2checkBox3的情况下,panelWindow显示jPanel2jPanel3,所以jPanel1的位置将替换为 jPanel2jPanel2 的位置替换为 jPanel3

 + checkBox2  |            jPanel2  |
-------------------------------------
 + checkBox3  |            jPanel3  |
------------------------------------- 
      ^                       ^
      |                       |
 checkBoxPanel            panelWindow

现在我不知道如何实现这个目标。我尝试使用 CardLayout,但在那种情况下 panelWindow 只是切换 jPanels

我想达到的目的是通过选择几个checkBoxes显示在panelWindow中选择的jPanels。如果没有选择任何 checkBoxes,那么 panelWindow 就是空的。

提前致谢。

创建对列表checkbox/panel。将所有对添加到容器中,但使面板不可见。根据复选框的状态,为每个复选框添加一个侦听器 show/hide 面板。

根据@StanislavL 的建议,我在 JCheckBoxesJPanel 之间创建了一个 Map,并带有一个 ItemListener 用于显示和隐藏面板。

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();
    }
}

备注:

  • ItemListener 中的 pack() 调用是必要的,只是为了尊重我为面板设置的首选尺寸。
  • 您可能希望通过在构造中将 JCheckBox 传递给它来使 ItemListener 更 "type safe":

    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();
        }
    }