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