我有一個JComboBox需要在某個時間點被禁用,但我覺得disabled
狀態使得它難以閱讀,因爲它具有較低的對比度。在禁用的JComboBox中提供更好的可讀性/對比度JComboBox
如果僅將下拉箭頭按鈕顯示爲禁用,並保持框渲染器處於啓用狀態,那就太好了。
實際:期望:
有一種簡單的方式實現這一目標或類似的東西?
謝謝!
我有一個JComboBox需要在某個時間點被禁用,但我覺得disabled
狀態使得它難以閱讀,因爲它具有較低的對比度。在禁用的JComboBox中提供更好的可讀性/對比度JComboBox
如果僅將下拉箭頭按鈕顯示爲禁用,並保持框渲染器處於啓用狀態,那就太好了。
實際:期望:
有一種簡單的方式實現這一目標或類似的東西?
謝謝!
我已經結束了偷看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
方法
這裏是你有另一種選擇:。
jComboBox1.setRenderer(new DefaultListCellRenderer() {
@Override
public void paint(Graphics g) {
setForeground(Color.BLACK);
super.paint(g);
}
});
你只需要實例化後添加以下代碼字母將永遠留黑色的。組合框框架將變成如果您禁用或啓用,則爲灰色或黑色。
他們看起來像這樣:
下面是另一個黑客,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
(這似乎不太可能)。但到目前爲止,這是服務於我的目的。
試試這個 **
UIManager.put("ComboBox.disabledBackground", new Color(212,212,210));
UIManager.put("ComboBox.disabledForeground", Color.BLACK);
**
結果可以用下面的代碼來實現:
Component editorComponent = comboBox.getEditor().getEditorComponent();
if(editorComponent instanceof JTextComponent){
((JTextComponent)editorComponent).setDisabledTextColor(Color.black);
}
沒幾個大號& F檢驗它,但它可能會有所作爲,因爲這會觸發PropertyChange事件(「disabledTextColor」)。請參閱docs。
不幸的是,這與其他解決方案具有相同的缺點,UI管理器使用塗漆技術來調暗組件的效果仍然不理想。另外,paint方法將被調用的次數比`setForeground`多,所以保持不變並覆蓋另一個效果會更有效率。 – fortran 2011-01-31 09:56:37
它看起來不像「想要的」嗎? – 2011-01-31 10:05:42