ある時点で無効にする必要のあるJComboBoxがありますが、disabled
コントラストが低いため、ステータスが非常に読みにくくなっていると感じています。
ボックスレンダラーを有効にしたまま、ドロップダウン矢印ボタンのみが無効として表示されると便利です。
実際:望ましい:
これまたは類似のものを達成する簡単な方法はありますか?
ありがとう!
ある時点で無効にする必要のあるJComboBoxがありますが、disabled
コントラストが低いため、ステータスが非常に読みにくくなっていると感じています。
ボックスレンダラーを有効にしたまま、ドロップダウン矢印ボタンのみが無効として表示されると便利です。
実際:望ましい:
これまたは類似のものを達成する簡単な方法はありますか?
ありがとう!
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));
}
setForeground
そのため、レンダラーコンポーネントとして、何もしないようにオーバーライドされたメソッドを持つJLabelを使用しました。したがって、色が変更されることはなく、デフォルトの黒の値が維持されます。
問題は、このトリックが実装固有であるということです。特定のLook&FeelまたはUI Managerは、コンポーネントの色を変更する代わりに、半透明のレイヤーでオーバーペイントして無効なアイテムを表示するなど、他のことを行う場合があります:-(
setForeground
インストールされているL&FまたはUI Managerがメソッドを呼び出さない場合、テストで少なくとも警告が表示される可能性があります。
これがあなたが持っている別のオプションです:
jComboBox1.setRenderer(new DefaultListCellRenderer() {
@Override
public void paint(Graphics g) {
setForeground(Color.BLACK);
super.paint(g);
}
});
インスタンス化後にこのコードを追加する必要があります。文字は常に黒のままになります。無効または有効にすると、コンボボックスのフレームが灰色または黒に変わります。
彼らはこのように見えます:
Michael Grimesによる別のハックがありますが、これは特定のルックアンドフィールの影響を受けないはずです。秘訣は、コンボボックスを編集可能にすることです。JTextField
これは、エディターがsetDisabledTextColor
メソッドをサポートしているときに公開されます。また、コンボボックスを無効にしているので、編集可能であるかどうかは関係ありません。これを行うために使用しているコード(Scalaから翻訳)は次のとおりです。
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
、同様の文字列を指定できます。これは、エディターがカスタムレンダラーを無視するために必要です。デフォルトのレンダラーを使用している場合は、その行について心配する必要はありません。一方、より複雑なレンダラーを使用している場合は、まったく別のことを行う必要があるかもしれません。
これは恐ろしい恨みであるという事実にもかかわらず、それは機能し、実装で定義された機能に依存していないようです。この破損を想像できる2つの場所は、(a)編集可能なコンボボックスが編集不可能なコンボボックスと大きく異なる場合です(たとえば、最初の試みでテキストフィールドの背景色が変更されなかったため、見栄えが悪くなりました) 、または(b)aBasicComboBoxEditor
を返すのをやめた場合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);
}
いくつかのL&Fでテストしませんでしたが、PropertyChangeイベント( "disabledTextColor")が発生するため、違いが生じる可能性があります。ドキュメントを参照してください 。