通过选择 jCheckBoxes 添加 jPanel
add jPanels by selecting jCheckBoxes
正如您从布局中看到的那样,我想通过选择 checkBoxes
添加(或显示)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
。
我想达到的目的是通过选择几个checkBoxes
显示在panelWindow
中选择的jPanels
。如果没有选择任何 checkBoxes
,那么 panelWindow
就是空的。
提前致谢。
创建对列表checkbox/panel。将所有对添加到容器中,但使面板不可见。根据复选框的状态,为每个复选框添加一个侦听器 show/hide 面板。
根据@StanislavL 的建议,我在 JCheckBoxes
和 JPanel
之间创建了一个 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();
}
}
正如您从布局中看到的那样,我想通过选择 checkBoxes
添加(或显示)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
。
我想达到的目的是通过选择几个checkBoxes
显示在panelWindow
中选择的jPanels
。如果没有选择任何 checkBoxes
,那么 panelWindow
就是空的。
提前致谢。
创建对列表checkbox/panel。将所有对添加到容器中,但使面板不可见。根据复选框的状态,为每个复选框添加一个侦听器 show/hide 面板。
根据@StanislavL 的建议,我在 JCheckBoxes
和 JPanel
之间创建了一个 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(); } }