4
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class Test1{
    JComboBox combo;
    JTextField txt;

    public static void main(String[] args) {
        Test1 b = new Test1();
    }

    public Test1(){
        String degrees[] = {"AAS1","AAS2","AAS1","AAS3"};
        JFrame frame = new JFrame("Creating a JComboBox Component");
        JPanel panel = new JPanel();

        combo = new JComboBox(degrees);
        combo.setEditable(true);
        combo.setBackground(Color.gray);
        combo.setForeground(Color.red);

        txt = new JTextField(10);
        txt.setText("1");

        panel.add(combo);
        panel.add(txt);
        frame.add(panel);

        combo.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent ie){
                txt.setText(String.valueOf(combo.getSelectedIndex()+1));
            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400,400);
        frame.setVisible(true);

    } }

上記のコードからわかるように。私は4つのアイテムを持つJComboBoxを持っています。同じアイテムがなければ、すべてOKです。

しかし、私の例( "AAS1"、 "AAS2"、 "AAS1"、 "AAS3")では、最初と3番目の項目は同じであり、この場合は問題があります。JTextFieldでインデックスを取得したいアイテムを選択すると、3番目のアイテムを選択すると、最初のアイテムのインデックスが取得されます。何か考えはありますか?

4

4 に答える 4

4

これは、JComboBoxがequalsを使用してアイテムの同等性をチェックしているためです。あなたの場合、これらの2つの文字列は等しいので、一致する最初のインデックスを返します。本当にそれを行う必要がある場合は、次のように独自のアイテムクラスを定義する必要があります。

private static class MyItem {
    private String value;

    public MyItem(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return value; //this is what display in the JComboBox
    }
}

次に、次のようなアイテムを追加します。

MyItem degrees[] = {new MyItem("AAS1"),new MyItem("AAS2"),new MyItem("AAS1"),new MyItem("AAS3")};
JComboBox combo = new JComboBox(degrees);
于 2012-04-16T18:24:17.920 に答える
2

次のようなクラスを作成します。

class ComboItem{

    private String name;

    public ComboItem(String name){
        this.name = name;
    }

    public String toString() {
        return name;
    }
}

コンボボックスを作成します。

comboBox = new JComboBox(new ComboItem[]{
    new ComboItem("AAS1"),
    new ComboItem("AAS2"),
    new ComboItem("AAS1"),
    new ComboItem("AAS3")
});
于 2012-04-16T18:16:39.360 に答える
0

Stringsアイテムと効果的な表現でequalsがどのように計算されるかを分離する必要があります。これは、目的に合わせて特定のクラスを作成し、その代わりに使用するだけで実行できると思いますString

これは宿題になる可能性があるため、正確な結果を出すつもりはありませんJComboBox。指定されたインデックスを内部でどのように選択するかを考えてみてください。

于 2012-04-16T17:48:39.800 に答える
0

combo.getSelectedItem()代わりに使用してみてください。文字列配列には2つの異なる文字列があるため、参照比較を実行して、2つの違いを判断できるはずです。

于 2012-04-16T17:56:19.180 に答える