1

Swing プロジェクトに多数のチェックボックスがあります。チェックボックスごとに、実行する特定のクエリを選択/選択解除します。チェックボックスのソースを取得する1つの方法は知っています

public void itemStateChanged(ItemEvent e)  {
if(e.getSource=="checkbox object")
{ 
some code goes here; 
}
}

このソリューションよりもチェックボックスの数が少ない場合は最適ですが、チェックボックスが多数ある場合は、長いコードを記述する必要があります。単一のコマンドでイベントを引き起こすチェックボックスのオブジェクトを見つける方法はありますか?

4

3 に答える 3

6

このようにして選択したチェックボックスを取得できます

JCheckBox checkBox1 = new JCheckBox("Check1");
 JCheckBox checkBox2 = new JCheckBox("Check2");
 checkBox1.setName("Check1");
 checkBox2.setName("Check2");
 ItemListener listener = new ItemListener() {
    @Override
    public void itemStateChanged(ItemEvent e) {
        JCheckBox check = (JCheckBox)e.getSource();
         String name = check.getName();
         System.out.println(name);
    }
};
checkBox1.addItemListener(listener);
checkBox2.addItemListener(listener);
于 2013-01-15T08:04:13.660 に答える
1

非常に統一された方法でチェックを処理する場合は、イベントをより簡単に処理するのに役立つ何らかの構造 (おそらくデータ ソースまたは何らかの処理オブジェクト) にそれらをマッピングして、JChekBoxes をに配置すると役立つ場合があります。HashMapチェックボックスを作成・追加・登録するメソッドを持つことで、さらにコード量を削減できます。一般的な考え方は次のとおりです

HashMap<JCheckBox, String> urls = new HashMap<JCheckBox, String>();   
    // Here I use String but can be any complex data structure.

ActionListener listener = new ActionListener() {        
    public void actionPerformed(ActionEvent e) {
        String url = urls.get(e.getSource());
                    // Work with the selected URL now
    }
};

void buildCheckBoxes() {
    register("http://wikipedia.org");
    register("http://stackoverflow.com");
            // and 101 others, or load the list from the file.
}

void register(String url) {
    JCheckBox box = new JCheckBox("Use "+url);
    urls.put(box, url);
    box.addActionListener(listener);
             // One listener for all, defined above
    myPanel.add(box);
            // Some panel probably with GridLayout
}

反対に、アクションが非常に異なる場合は、異なるアクションごとに個別のリスナー (おそらく内部クラスまたは匿名クラス) を使用することをお勧めします。

    JCheckBox boxA = new JCheckBox("A");
    JCheckBox boxB = new JCheckBox("B");

boxA.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
               // Only code for boxA
    }
});

boxB.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
               // Only code for boxB
    }
});

リスナーにコードが追加されたらすぐに、それをメイン クラスのメソッドに移動する必要があります。

于 2013-01-15T07:56:10.377 に答える
0

どのコンポーネント (CheckBox または他のコンポーネント) が Java でイベントを生成したかを知りたい場合は、「setName(name)」メソッドを使用してそのコンポーネントに名前を割り当てることができます。

// For CheckBox
JCheckBox checkBox1 = new JCheckBox();
checkBox1.setName("CheckBox1");

// Any other Component
JButton button1 = new JButton();
button1.setName("Button1");

リスナー クラスでは、現在のイベントを生成したソース オブジェクトを取得できます。

// CheckBox Listener
public void itemStateChanged(ItemEvent e)  
{
    JCheckBox source = (JCheckBox)e.getSource();

    if(source.getName().equals("CheckBox1"))
    { 
        //some code goes here; 
    }
}
于 2013-01-15T08:20:51.147 に答える