質問

ある時点で無効にする必要があるjcomboboxがありますが、 disabled ステータスは、それが持っている低いコントラストであるため、読み取りが非常に難しくなります。

ボックスレンダリングを有効にしているかのように、ドロップダウン矢印ボタンのみが無効になっていると表示される場合は、それは素晴らしいことです。

実際: actual combo 希望: desired result

これを達成する簡単な方法や似たようなことはありますか?

ありがとう!

役に立ちましたか?

解決

私はこれを見つけた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マネージャーは、コンポーネントの色を変更する代わりに、無効なアイテムを表示するために半透明レイヤーで過剰摂取するなど、他のことを行う場合があります:-(

インストールされたL&FまたはUIマネージャーが電話をかけない場合、少なくともテストは少なくとも警告を発する可能性があります setForeground 方法。

他のヒント

ここにあなたが持っている別のオプションがあります:

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

インスタンス化後にこのコードを追加する必要があります。文字は常に黒のままです。コンボボックスフレームは、無効または有効にすると、グレーまたはブラックのいずれかになります。

彼らはこのように見えます:

enter image description here

これが別のハックです、 マイケル・グライムズのため, 、特定のルックアンドフィールの影響を受けるべきではありません。トリックは、コンボボックスを編集可能にすることです。 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)if 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);
    }

私はいくつかのL&Fでそれをテストしませんでしたが、これによりプロパティチェンジイベント(「DisabledTextColor」)が発生するため、違いを生む可能性があります。を参照してください ドキュメント.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top