2013-01-15 107 views
0

當我展開組合框列表時,應該會看到諸如「one」,「two」,「three」等項目,但是當我選擇「one」並摺疊組合框時,喜歡看到「1」而不是「一個」。讓JComboBox在項目選擇時更改顯示的項目

我曾嘗試加入ListDataListener到ComboBox和內部contentsChanged()我做 box.getEditor().setItem(my_map.get("one"))其中my_map存儲從「一」到「1」的映射等

但是,它不工作,我不知道爲什麼.. contentsChanged()被稱爲覆蓋我的更改後發生了什麼事嗎?

任何想法?

+0

你能粘貼與這個問題有關的代碼嗎? – asgs

回答

2

一種方法是不改變內容,但提供一個適當的渲染器,它在繪畫期間檢查它是否在彈出框內。

enter image description here

的證明了概念的代碼片段如下所示:

JComboBox box = new JComboBox(new String[] { "One|1", "Two|2", "Three|3" }); 

box.setRenderer(new ListCellRenderer<String>() { 

    private JList<? extends String> list; 
    private final JLabel label = new JLabel() { 
     @Override 
     public void paintComponent(Graphics g) { 
      // Check if parent's parent is the combobox or the dropdown 
      int part = getParent().getParent() == list ? 0 : 1; 
      label.setText(label.getText().split("\\|")[part]); 
      super.paintComponent(g); 
     } 
    }; 

    @Override 
    public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) { 
     this.list = list; 
     label.setText(value); 
     label.setOpaque(true); 
     if (isSelected) { 
      label.setForeground(list.getSelectionForeground()); 
      label.setBackground(list.getSelectionBackground()); 
     } else { 
      label.setForeground(list.getForeground()); 
      label.setBackground(list.getBackground()); 
     } 
     return label; 
    } 
}); 

注:上面的示例沒有正確處理各方面(如重點邊境...),但僅僅是一個提示你如何進一步進行。

+0

謝謝霍華德。看起來它會做的伎倆。早些時候,我通過調用'box.setSelectedItem()'而不是'box.getEditor()。setItem()'來實現它。因爲'box.setSelectedItem()'觸發了一次以上的調用,所以我不得不在邏輯上做一些事情來壓制下面的'contentsChanged()'。 – user1861088