面白い :-)
- 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 にはまだ問題があるため、デフォルトではインストールされません)。
(問題の 2) サポートされていません。componentProvider は、呼び出しごとにまったく同じプロパティで構成された同じ単一のコンポーネントを返すように設計されています。
(質問の3)咳...いいえ、ソースと例(デモとテストパッケージ内)だけです
編集(質問の編集部分に回答するため)
いいえ、現在の WrappingIconpPanel では、Borderlayout を使用しますが、これはご存知のように :-) 最大サイズを尊重しません。BoxLayout を使用すると、完全には覚えていない問題が発生します。それにもかかわらず、ボタンの最大値が尊重されるように、それは微調整する場所です
うーん...カーソルの変更をどのように実装したか完全にはわかりません。それがあなたの ButtonProvider にあると仮定します: isRolloverEnabled を実装して、表示されているかどうかに応じて true/false を返しますEdit-in-Editは機能しません。理由はわかりませんが、これはロールオーバー検出および/または WrappingProvider での処理のバグである可能性があります
今週末にオフ:-)