2013-05-21 45 views
4

我有一个JComboBox,其中包含三个项目{"Personel", "Magasinier", "Fournisseur"}显示JComboBox的不可选默认值

我希望这个JComboBox显示值"Choisir une option :",这是一个不可选择的值。

我想这个代码initComponents();后:

this.jComboBox1.setSelectedItem("Choisir une option :"); 

,但它不工作。

我该怎么做?

+0

搜索类似'placeholder'属性,它进来HTML挥杆 – Abubakkar

+1

参见本[Q&A](http://stackoverflow.com/q/5231517/230513)。 – trashgod

回答

4

您可以覆盖选择代码在你JComboBox模型,其代码如下所示SSCCE:

public class JComboExample { 

    private static JFrame frame = new JFrame(); 
    private static final String NOT_SELECTABLE_OPTION = " - Select an Option - "; 
    private static final String NORMAL_OPTION = "Normal Option"; 

    public static void main(String[] args) throws Exception { 
    JComboBox<String> comboBox = new JComboBox<String>(); 

    comboBox.setModel(new DefaultComboBoxModel<String>() { 
     private static final long serialVersionUID = 1L; 
     boolean selectionAllowed = true; 

     @Override 
     public void setSelectedItem(Object anObject) { 
     if (!NOT_SELECTABLE_OPTION.equals(anObject)) { 
      super.setSelectedItem(anObject); 
     } else if (selectionAllowed) { 
      // Allow this just once 
      selectionAllowed = false; 
      super.setSelectedItem(anObject); 
     } 
     } 
    }); 

    comboBox.addItem(NOT_SELECTABLE_OPTION); 
    comboBox.addItem(NORMAL_OPTION); 

    frame.add(comboBox); 
    frame.pack(); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     frame.setVisible(true); 
     } 
    }); 
    } 
} 

这将显示一个组合框的“- Select an Option -”的INTIAL选择。只要用户选择另一个选项,就不可能再次选择原始选项。

+2

检查类似的方法[这里](http://stackoverflow.com/a/5231915/230513)。 – trashgod

+1

+1,但通过@camickr查看[Combo Box Prompt](http://tips4java.wordpress.com/2008/10/18/combo-box-prompt/),之所以不在这里发布任何代码或写了一个答案,任何我的答案将是如何重新发明轮子,编辑标签更好的答案 – mKorbel

+0

thnaks很多;) –

2

我偶然发现了这个问题,并对邓肯的答案做了一些修改。我的解决方案如下所示:

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的一个匿名子类型并覆盖toString()方法,因此不会在最终类上工作(如果comboBox持有从接口继承的类,它会变得混乱,因为匿名子类型需要实现接口,因而会有返回null方法。)