2011-01-28 38 views
9

我有一個JComboBox需要在某個時間點被禁用,但我覺得disabled狀態使得它難以閱讀,因爲它具有較低的對比度。在禁用的JComboBox中提供更好的可讀性/對比度JComboBox

如果僅將下拉箭頭按鈕顯示爲禁用,並保持框渲染器處於啓用狀態,那就太好了。

實際:actual combo期望:desired result

有一種簡單的方式實現這一目標或類似的東西?

謝謝!

回答

6

我已經結束了偷看BasicComboBoxUI,在那裏我發現這一點:

 if (comboBox.isEnabled()) { 
      c.setForeground(comboBox.getForeground()); 
      c.setBackground(comboBox.getBackground()); 
     } 
     else { 
      c.setForeground(DefaultLookup.getColor(
        comboBox, this, "ComboBox.disabledForeground", null)); 
      c.setBackground(DefaultLookup.getColor(
        comboBox, this, "ComboBox.disabledBackground", null)); 
     } 

所以我作爲渲染器組件一個JLabel與重寫什麼都不做的setForeground方法。因此,顏色永遠不會改變,並保持默認的黑色值。

問題是,這個技巧是特定於實現的。一個給定的外觀&覺得還是UI經理可能做其他事情一樣具有半透明層,以顯示已禁用項目overpainting而不是改變組件的顏色:-(

也許測試至少可以給予警告,如果安裝了大號& F或UI管理器不會調用setForeground方法

6

這裏是你有另一種選擇:。

jComboBox1.setRenderer(new DefaultListCellRenderer() { 
     @Override 
     public void paint(Graphics g) { 
      setForeground(Color.BLACK); 
      super.paint(g); 
     } 
    }); 

你只需要實例化後添加以下代碼字母將永遠留黑色的。組合框框架將變成如果您禁用或啓用,則爲灰色或黑色。

他們看起來像這樣:

enter image description here

+1

不幸的是,這與其他解決方案具有相同的缺點,UI管理器使用塗漆技術來調暗組件的效果仍然不理想。另外,paint方法將被調用的次數比`setForeground`多,所以保持不變並覆蓋另一個效果會更有效率。 – fortran 2011-01-31 09:56:37

+1

它看起來不像「想要的」嗎? – 2011-01-31 10:05:42

6

下面是另一個黑客,due to Michael Grimes,這不應該由特定的外觀受到影響和感覺。訣竅是使組合框可編輯;作爲編輯器支持setDisabledTextColor方法的JTextField。而且由於你禁用了組合框,所以它可以編輯並不重要!我使用要做到這一點(從斯卡拉翻譯)的代碼如下:

JComboBox cb = ...; 
... 
cb.setEditable(true); 
ComboBoxEditor editor = cb.getEditor() 
JTextField  etf = (JTextField)etf.getEditorComponent() 
etf.setDisabledTextColor(UIManager.getColor("ComboBox.foreground")); 
etf.setBackground(UIManager.getColor("ComboBox.background")); 
// editor.setItem(format(obj)); 
cb.setEnabled(false); 

演員是保證在這裏取得成功,因爲我們使用BasicComboBoxEditor,其文檔說「的編輯器爲實現一個JTextField「。註釋行出現的原因是我使用了一個自定義渲染器,該自定義渲染器使用圍繞它們的額外文本打印整數;調用setItem允許我指定一個類似的字符串,並且是必要的,因爲編輯器會忽略自定義渲染器。如果您使用的是默認渲染器,那麼您無需擔心該行;另一方面,如果你使用的是更復雜的渲染器,那麼你可能需要完全做其他的事情。

儘管事實上,這是一個可怕的雜牌組裝電腦,它工作,它似乎並不依賴於任何實現定義功能。我可以想象這個突破的兩個地方是(a),如果一個可編輯的組合框與一個不可編輯的組合框看起來非常不同(例如,我的第一次嘗試沒有改變文本字段的背景顏色,這看起來是錯誤的) ,或者(b)如果BasicComboBoxEditor停止返回JTextField(這似乎不太可能)。但到目前爲止,這是服務於我的目的。

4

試試這個 **

UIManager.put("ComboBox.disabledBackground", new Color(212,212,210)); 
UIManager.put("ComboBox.disabledForeground", Color.BLACK); 

**

0

結果可以用下面的代碼來實現:

Component editorComponent = comboBox.getEditor().getEditorComponent(); 
    if(editorComponent instanceof JTextComponent){ 
     ((JTextComponent)editorComponent).setDisabledTextColor(Color.black); 
    } 

沒幾個大號& F檢驗它,但它可能會有所作爲,因爲這會觸發PropertyChange事件(「disabledTextColor」)。請參閱docs