パネルでコンボボックスを使用し、テキストのみのアイテムを追加できることを知っています。
comboBox.addItem('item text');
しかし、html selectのように、アイテムとアイテムテキストの値を使用する必要がある場合があります。
<select><option value="item_value">Item Text</option></select>
コンボボックスアイテムに値とタイトルの両方を設定する方法はありますか?
今のところ、この問題を解決するためにハッシュを使用しています。
クラスで値をラップし、toString()
メソッドをオーバーライドします。
class ComboItem
{
private String key;
private String value;
public ComboItem(String key, String value)
{
this.key = key;
this.value = value;
}
@Override
public String toString()
{
return key;
}
public String getKey()
{
return key;
}
public String getValue()
{
return value;
}
}
ComboItemをcomboBoxに追加します。
comboBox.addItem(new ComboItem("Visible String 1", "Value 1"));
comboBox.addItem(new ComboItem("Visible String 2", "Value 2"));
comboBox.addItem(new ComboItem("Visible String 3", "Value 3"));
選択したアイテムを取得するたびに。
Object item = comboBox.getSelectedItem();
String value = ((ComboItem)item).getValue();
任意のオブジェクトをアイテムとして使用できます。そのオブジェクトでは、必要なフィールドをいくつか持つことができます。あなたの場合、値フィールド。テキストを表すには、toString()メソッドをオーバーライドする必要があります。あなたの場合は「アイテムテキスト」。例を参照してください。
public class AnyObject {
private String value;
private String text;
public AnyObject(String value, String text) {
this.value = value;
this.text = text;
}
...
@Override
public String toString() {
return text;
}
}
comboBox.addItem(new AnyObject("item_value", "item text"));
addItem(Object)はオブジェクトを受け取ります。デフォルトのJComboBoxレンダラーは、そのオブジェクトに対してtoString()を呼び出し、それがラベルとして表示されます。
したがって、addItem()にStringを渡さないでください。 toString()メソッドが必要なラベルを返すオブジェクトを渡します。オブジェクトには、他のデータフィールドをいくつでも含めることができます。
これをコンボボックスに渡して、どのようにレンダリングされるかを確認してください。 getSelectedItem()は、値を取得するためにウィジェットに戻すことができるオブジェクトを返します。
public final class Widget {
private final int value;
private final String label;
public Widget(int value, String label) {
this.value = value;
this.label = label;
}
public int getValue() {
return this.value;
}
public String toString() {
return this.label;
}
}
setSelectedIndex
はシーケンシャルインデックスを使用するため、メソッド呼び出しsetSelectedIndex("item_value");
は機能しません。