0

私はJavaスイングが初めてです。チェックボックスを生成するコードがあります。フレームのどこかにボタンを配置したいのですが、クリックすると、選択したチェックボックスのエントリが削除されます。これが私がこれまでに持っているものです。

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必要なときに参照できるようにします。

次に、必要な場所に a を追加しJButtonます。次に、これを繰り返して、チェックボックスを含むコンポーネントをArrayList呼び出します。次のステートメントは、コンテナーinvalidate()でメソッドを呼び出すことです。。 remove()_checkPanel

removeAll()または、コンテナー内のすべてのコンポーネントがチェック ボックスであり、それらを削除する 場合に呼び出すこともできます。

チェックボックスに加えてさまざまなコンポーネントがたくさんある場合は、StanislavLが指摘する代替手段も良いものです

于 2013-11-01T14:01:57.587 に答える
1

私は2つのアプローチを考えることができます:

  • JPanelのインスタンスのみを含む 1 つのインスタンスを維持し ている場合は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()checkBoxPanel

  • ItemListenerのインスタンスで使用して、JCheckBox選択状態の変更時に何かを行うことができます。のインスタンスを使用して、 をリストArrayList<JCheckBox>に追加しselected checkBoxます。ただし、実装された ItemListener:MyItemListener implements ItemListenerを使用して、1 つのインスタンスを作成し、このインスタンスをすべてのインスタンスに追加してcheckboxes、状態の変化に対応する必要があります。イベント ソースを使用して、実行されるインスタンスe.getSource()を取得できます。JCheckBoxItemEvent

チュートリアル リソース:

  1. アイテムリスナーの書き方
于 2013-11-01T14:21:22.877 に答える