私はこの質問に出くわし、ダンカンの答えにいくつかの変更を加えました. 私のソリューションは次のようになります。
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
public class JEComboBox<T> extends JComboBox<T> {
public JEComboBox(final T placeHolder){
setModel(new DefaultComboBoxModel<T>() {
private static final long serialVersionUID = 1L;
boolean selectionAllowed = true;
@Override
public void setSelectedItem(Object anObject) {
if (!placeHolder.equals(anObject)) {
super.setSelectedItem(anObject);
} else if (selectionAllowed) {
// Allow this just once
selectionAllowed = false;
super.setSelectedItem(anObject);
}
}
});
addItem(placeHolder);
}
}
プレースホルダーを追加するときは、匿名オブジェクトを作成し、toString メソッドをオーバーライドします。実装は次のようになります。
public class car{
String final model;
public car(String model){
this.model = model;
}
}
JEComboBox の作成:
JEComboBox comboBoxWithPlaceHolder = new JEComboBox<Car>(new Car{
public String toString(){
return "- Select your car -"
}
});
長所
短所
- T および Override toString() メソッドの匿名サブタイプを実装する必要があるため、最終クラスでは機能しません (匿名サブタイプはインターフェースを実装する必要があるため、インターフェースから継承するクラスをコンボボックスが保持している場合、混乱する可能性があります。 null を返すメソッドになります。)