JComboBoxにカスタムレンダラを使用します。たとえば、以下のコードでは、デフォルトのリストセルレンダラーから拡張されたレンダラーを使用しています。それがないすべては、JComboBoxの、JobTitleオブジェクトの各セルに保持された値を取得することで、このオブジェクトから名前を抽出し、名前表示されます。
JComboBox<JobTitle> jobCombo = new JComboBox<>(JobTitle.values());
jobCombo.setRenderer(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(JList<?> list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
value = ((JobTitle) value).getName();
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
});
なぜこれを行うには?ユーザーがコンボボックスから項目を選択した場合、それはStringではなく本格的なJobTitle enumオブジェクトです。私はコンボボックスと列挙型のさまざまな上記を行う方法を作りたい場合
、スイッチがライン上でそのキャストに対処するための最もエレガントな方法である:あなたのコメントについて
9?
public enum JobTitle implements Textable {
ARCHITECT("Architect"), TOWN_PLANNER("Town Planner"), URBAN_DESIGNER(
"Urban Designer"), LANDSCAPE_GARDENER("Landscape Gardener");
private final String text;
private JobTitle(String name) {
this.text = name;
}
@Override
public String getText() {
return text;
}
}
public interface Textable {
String getText();
}
そして、:のような全く新しい質問だと、おそらく、別途掲示しなければならない
が、一つの可能な解決策は、すべての列挙型を同じインタフェースを提供することです、何か自分自身のレンダラークラスを作成します。
public class TextableRenderer extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList<?> list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
value = ((Textable) value).getText();
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}
これは、Textableインターフェイスを実装する任意の列挙型(またはクラス)で動作します。
そして使用:
final JComboBox<JobTitle> jobCombo = new JComboBox<>(JobTitle.values());
jobCombo.setRenderer(new TextableRenderer());
使用列挙型をしかし、コンボボックスに適切な列挙型のテキストを表示するカスタムレンダラを与えます。 –
以下は、[列挙型変数値で 'JComboBox'を埋め込む方法]の例です(https://stackoverflow.com/a/42603111/2180785) – Frakcool
' getName() 'という名前はお勧めしません。 'name()'メソッドと混同される可能性があります。 – shmosel