SwingXコンポーネントプロバイダー:特定の行でコンポーネントを非表示にします

StackOverflow https://stackoverflow.com/questions/9311455

質問

SwingXのComponentProviderをサブクラス化してJButtonsを提供しましたが、JXTreetableのいくつかの行で、ボタンを表示したくありません。私が望む最後の「結果」は、プロバイダーを設定していない列に空のテキストを表示するときに得られるもののように、空のセルを持つことです。

  1. レンダリングされたコンポーネントを特定の行に非表示にすることは可能ですか(たとえば、値に応じて)?設定 setVisible(false) レンダリングされたコンポーネントで format() また configureState() うまくいきません。

  2. Subclass ComponentProviderをサブクラス化して、さまざまないくつかのタイプのコンポーネントを提供することは可能ですか?はいの場合、それはどのように機能しますか?

  3. ComponentProviderが提供する可能性のいくつかの例と、どの方法が何をするかについての明確な説明をどこで見つけることができますか(たとえば、間の違いをほとんど理解していません configureState()format())?

編集

  1. JX(ツリー)のテーブルに表示されているJButtonがセルと同じくらい広いことを防ぐことは可能ですか?

  2. 別の蛍光ペンを作成した場合、別の述語(ロールオーバーまたは何か)を使用してカーソルを変更できますか?ボタンが隠されている場合でも、カーソルは(リンク上)ハンドに変更します。

どうもありがとう!

役に立ちましたか?

解決

面白い :-)

  1. CellRendererPaneはコンポーネントの可視プロパティを尊重しないため、通常は機能しません。常にスタンプします。ただし、実際のプロバイダーがラッピングプロバイダーにラップされ、そのラッパーのコンポーネントが見えないように設定されている場合、SwingXで動作できます。

概念実証と同じように、スニペット

table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
        new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {

            @Override
            protected void configureState(CellContext context) {
                super.configureState(context);
                rendererComponent.getComponent().setVisible(context.getRow() != 5);
            }

        }
));

一方、プロバイダーはそうです いいえ カスタムコンテキスト依存性構成に接続する場所。それは蛍光ペンで、fiのように行う必要があります

AbstractHighlighter highlighter = new AbstractHighlighter(HighlightPredicate.EVEN) {

    @Override
    protected Component doHighlight(Component component,
            ComponentAdapter adapter) {
        ((WrappingIconPanel) component).getComponent().setVisible(false);
        return component;
    }

    @Override
    protected boolean canHighlight(Component component,
            ComponentAdapter adapter) {
        return component instanceof WrappingIconPanel;
    }


};
table.addHighlighter(highlighter);

プロバイダーでリセットされることが保証されているプロパティの1つではないため、予想どおりに機能しません(ボタンは常に非表示になります)。カスタムプロバイダーがこれらの保証を拡張することを妨げるものはありません。

table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
        // custom wrappingProvider which guarantees the reset of visible
        // property of the wrapped component
        new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {
            @Override
            protected void configureState(CellContext context) {
                super.configureState(context);
                rendererComponent.getComponent().setVisible(true);
            }

        }
));

これで、蛍光ペンはコンテキストに基づいて目に見えるものを大胆に変更できます。わずかな視覚的なグリッチ:ラッピンコンパネルは、たとえ何もないとしても、アイコンのために常にいくつかのスペースを残します - その間隔を削除するのがなぜ起こるのか、それが安全か(Swingxで)かどうかはわかりません(ラッピングプロヴァーダーは元々使用することを目的としていますjxtree、コンポーネント向上にはまだ問題があるため、デフォルトではインストールされていません)。

  1. (質問で2)サポートされていない、コンポーネントプロバイダーは、各呼び出しでまったく同じプロパティで構成された同じ単一コンポーネントを返すように設計されています

  2. (質問の3)咳...いいえ、ソースと例(デモとテストパッケージ)

編集 (質問の編集された部分に答えるため)

  1. いいえ、現在のラッピックンパネルでは:borderlayoutを使用します。 BoxLayoutを使用すると、私が完全に覚えていない問題がありました。それにもかかわらず、それは微調整する場所になるので、ボタンのマックスが尊重されるようになります

  2. うーん...カーソルの変更をどのように実装したかは完全にはわかりません。 ButtonProviderにあると仮定する:ISrolloverEnabledを実装して、表示されるかどうかに応じてTrue/Falseを返すように実装してください 編集編集 うまくいきません。理由がわからない、これがlollover-dectectionおよび/またはlappingproviderでのハンドリングのバグである可能性がある

今週末にオフ:-)

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