使用java swing删除所选复选框

时间:2013-11-01 13:55:44

标签: java swing jcheckbox

我是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);

    }

}

2 个答案:

答案 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对于反映组件的布局和图形渲染方面的变化非常重要。

  • 您可以将ItemListenerJCheckBox的实例一起用于选择状态更改。使用ArrayList<JCheckBox>的实例将selected checkBox添加到列表中。但是,您应该使用已实现的ItemListener:MyItemListener implements ItemListener并创建一个实例,并将此实例添加到所有checkboxes以对状态更改做出反应。您可以使用事件源e.getSource()来获取执行JCheckBox的{​​{1}}实例。

教程资源:

  1. How to Write an Item Listener