【问题标题】:add jPanels by selecting jCheckBoxes通过选择 jCheckBoxes 添加 jPanel
【发布时间】:2015-04-29 09:27:07
【问题描述】:

从布局中可以看出,我想通过选择 checkBoxes 添加(或显示)jPanelspanelWindow 包含在 jScrollPane 中。

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

在选中checkBox2checkBox3的情况下,panelWindow会显示jPanel2jPanel3,所以jPanel1的位置会被jPanel2替换,jPanel2的位置会被替换为jPanel3.

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

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

我要实现的目标是通过选择几个checkBoxespanelWindow 中显示选定的jPanels。如果没有选择任何checkBoxes,则panelWindow 为空。

提前谢谢你。

【问题讨论】:

  • 我想我错过了一些东西。您希望 jPanel1 被 jPanel2 替换...但是在这种情况下 checkBox1 在哪里?如何设置 jPanel1 再次显示?
  • 贴出相关代码(好像除了功能你有布局排序),以便我们可以在答案中关联。

标签: java swing jpanel jcheckbox netbeans-8


【解决方案1】:

按照@StanislavL 的建议,我在JCheckBoxesJPanels 之间创建了一个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,使其更加“类型安全”:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-10
      • 2011-12-28
      • 1970-01-01
      • 2019-06-22
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      相关资源
      最近更新 更多