0

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

    }

}
4

2 回答 2

2

首先,将所有复选框保存在一个中,ArrayList以便在需要时可以参考它们。

然后,JButton在需要的地方添加一个。然后迭代它ArrayList并调用invalidate()包含您的复选框的组件。下一条语句是调用remove()容器上的方法;checkPanel. _

或者,removeAll()如果容器中的所有组件都是复选框并且您想要删除它们,您可以调用。

如果您有许多不同的组件以及复选框,StanislavL 指出的替代方案也是一个不错的选择

于 2013-11-01T14:01:57.587 回答
1

我可以想到两种方法:

  • 如果您正在维护一个 JPanel仅包含 的实例的实例JCheckBox,那么您可以首先获取所有复选框的 usingpanel.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()oncheckBoxPanel对于反映组件的布局和图形渲染的变化很重要。

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

教程资源:

  1. 如何编写项目监听器
于 2013-11-01T14:21:22.877 回答