2

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

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

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

  3. configureState()ComponentProvider が提供する可能性の例と、どのメソッドが何をするかについての明確な説明はどこにありますか (たとえば、との違いがほとんどわかりformat()ません)。

編集

  1. JX(Tree)?Table に表示される JButton がセルと同じ幅になるのを防ぐことは可能ですか?

  2. 別の蛍光ペンを作成する場合、別の述語 (ROLLOVER など) を使用してカーソルを変更できますか? ボタンが非表示になっていても、カーソルが(リンク上で)手の形に変わります。

どうもありがとう!

4

1 に答える 1

2

面白い :-)

  1. CellRendererPane はコンポーネントの visible プロパティを尊重しないため、通常は機能しません。常にスタンプします。BUT: 実際のプロバイダーが WrappingProvider にラップされ、そのラッパーのコンポーネントが非表示に設定されている場合、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);
            }

        }
));

これで、蛍光ペンはコンテキストに基づいて表示を恐れることなく変更できます。わずかな視覚的な不具合: WrappingIconPanel は、アイコンがない場合でも、常にアイコン用のスペースを残します。なぜそうなるのか、または (SwingX で) そのスペースを削除しても安全かどうかはよくわかりません (もともと、ラッピングプロバイダーはComponentOrientation にはまだ問題があるため、デフォルトではインストールされません)。

  1. (問題の 2) サポートされていません。componentProvider は、呼び出しごとにまったく同じプロパティで構成された同じ単一のコンポーネントを返すように設計されています。

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

編集(質問の編集部分に回答するため)

  1. いいえ、現在の WrappingIconpPanel では、Borderlayout を使用しますが、これはご存知のように :-) 最大サイズを尊重しません。BoxLayout を使用すると、完全には覚えていない問題が発生します。それにもかかわらず、ボタンの最大値が尊重されるように、それは微調整する場所です

  2. うーん...カーソルの変更をどのように実装したか完全にはわかりません。それがあなたの ButtonProvider にあると仮定します: isRolloverEnabled を実装して、表示されているかどうかに応じて true/false を返しますEdit-in-Editは機能しません。理由はわかりませんが、これはロールオーバー検出および/または WrappingProvider での処理のバグである可能性があります

今週末にオフ:-)

于 2012-02-17T15:10:50.040 に答える