我是java swing的新手。我有一个生成复选框的代码。我希望在我的框架中的某个位置有一个按钮,在点击时,应删除所选的复选框条目。这是我到目前为止所拥有的。
public class Scroll extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame frame = new JFrame("JFrame with ScrollBar");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new ResultButtonBar();
newContentPane.setOpaque(true);
JScrollPane scrollPane = new JScrollPane(newContentPane);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
frame.getContentPane().add(scrollPane);
frame.setSize(800, 800);
frame.setVisible(true);
JButton startButton = new JButton("Start");
frame.add(startButton, BorderLayout.SOUTH);
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null, "basdsadad");
}
});
}
}
和新的ResultButtonBar()。java
public class ResultButtonBar extends JPanel {
private HashMap<JCheckBox, ArrayList<Integer>> map = new HashMap<>();
private JLabel _label;
private static final int MAX_CHECKS = 1000;
public ResultButtonBar() {
super();
JButton btn = new JButton();
btn.setVisible(true);
JCheckBox checkBox;
Random r = new Random();
JPanel checkPanel = new JPanel(new GridLayout(0, 1));
_label = new JLabel("You selected nothing");
checkPanel.add(_label);
for (int i = 0; i < MAX_CHECKS; i++) {
StringBuilder sb = new StringBuilder();
ArrayList<Integer> a = new ArrayList<>();
for (int j = 0; j < 2; j++) {
Integer temp = (r.nextInt()) % 100;
a.add(temp);
sb.append(temp).append(" ");
}
checkBox = new JCheckBox(sb.toString().trim());
checkBox.setName("CheckBox" + i);
map.put(checkBox, a);
checkPanel.add(checkBox);
}
add(checkPanel);
}
}
答案 0 :(得分:2)
首先,将所有复选框保留在ArrayList
中,以便在需要时提供相应的参考。
然后,在您需要的任何地方添加JButton
。然后迭代此ArrayList
并在包含复选框的组件上调用invalidate()
。下一个语句是调用容器上的remove()
方法; checkPanel
。
或者,如果容器中的所有组件都是复选框,并且您想要删除它们,则可以调用removeAll()
。
如果你有很多不同的组件和复选框,那么StanislavL指出的替代方案也很好
答案 1 :(得分:1)
我可以想到两种方法:
如果您要维护一个仅包含JPanel
实例的JCheckBox
实例,那么您可以先使用panel.getComponents()
方法获取所有复选框,检查其选择状态和取决于状态通过调用panel.remove(component)
将其删除。例如:
Component checkBox[] = checkBoxPanel.getComponents();
for(Component c:checkBox)
if(((JCheckBox)c).isSelected())
checkBoxPanel.remove(c);
checkBoxPanel.revalidate();
checkBoxPanel.repaint();
revalidate()
上的最后一次通话repaint()
和checkBoxPanel
对于反映组件的布局和图形渲染方面的变化非常重要。
您可以将ItemListener
与JCheckBox
的实例一起用于选择状态更改。使用ArrayList<JCheckBox>
的实例将selected checkBox
添加到列表中。但是,您应该使用已实现的ItemListener:MyItemListener implements ItemListener
并创建一个实例,并将此实例添加到所有checkboxes
以对状态更改做出反应。您可以使用事件源e.getSource()
来获取执行JCheckBox
的{{1}}实例。
教程资源: