2

左側にアイテムのリスト、右側にテーブルがあるスイングアプリケーションを構築しています。右側に表示されるテーブルの数は、左側で選択されたアイテムによって異なります。表示されているすべてのテーブルで同じであるすべての行を「ハイライト」(setBackground)できるようにしたい。

prepareRendererまたはgetTableCellRendererComponentのオーバーライドについて読みました。条件付きレンダリングロジックは、オーバーライドメソッド内にあります。

DefaultTableCellRenderergetTableCellRendererComponentが呼び出されることはありませ http://tips4java.wordpress.com/2010/01/24/table-row-rendering/http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer

しかし、私が言えることと私が理解していること(間違っている場合は訂正してください)から、どちらのオプションでも、このオーバーライドされたメソッド内で2つの異なるJTableを同時に比較することはできません。prepareRendererは、JTableを拡張するクラスでオーバーライドされるため、特定のテーブルでインスタンス化されます。オーバーライドされたメソッドは、テーブルのその特定のインスタンスにのみ影響します。

public class CustomRenderer extends JTable {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    Component c = super.prepareRenderer(renderer, row, column);
    //  add custom rendering here
    return c;
}};

...
CustomRenderer currTable = new CustomRenderer();

getTableCellRendererComponentは、特定のJTableのcolumnModelから特定の列のsetCellRendererを介して設定されます。

public class CustomRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (isSelected) {
            l.setBackground(Color.gray);
        }
        else {
            l.setBackground(Color.white);
        }
    return l;
    }};

...
CustomRenderer cr = new CustomRenderer();
currTable.getcolumnModel().getColumn(1).setCellRenderer(cr);

では、どうすればいいですか

if(tableOne.getValueAt(1, 1).equals(tableTwo.getValueAt(1, 1) 
//set Cell 1,1 background(Color.blue)
else
//set Cell 1,1 background(Color.red)

現在、isSelectedブール値をテストし、それに応じて背景を変更するgetTableCellRendererComponentメソッドで複数のテーブルセルの選択を使用する非常に醜いハックがあります。今のところこれで十分ですが(このプログラムを使用しているのは私だけなので)、別のテーブルの条件または値に基づいて、あるテーブルのレンダリングを同時に比較および変更できるより良い方法が必要です。

それとも私は問題について間違っているのでしょうか?

読んだり返信したりしてくれてありがとう

4

3 に答える 3

4

prepareRendererまたはgetTableCellRendererComponentのオーバーライドについて読みました。条件付きレンダリングロジックは、オーバーライドメソッド内にあります。しかし、私が言えることと私が理解していること(間違っている場合は訂正してください)から、どちらのオプションでも、このオーバーライドされたメソッド内で2つの異なるJTableを同時に比較することはできません。

なぜあなたはこれを言うのですか、そしてそれが間違っているのであなたはこの声明をバックアップしなければならないのですか?

prepareRendererはJTableを拡張します

メソッドはクラスを拡張できないため、これは意味がありません。

したがって、オーバーライドされたメソッドはJTableの特定のインスタンスにのみアクセスでき、getTableCellRendererComponentは、特定のJTableのcolumnModelから特定の列のsetCellRendererを介して設定されます。

メソッドは、プログラマーがアクセスできるようにしたものすべてにアクセスできます。重要なのは参照を渡すことです。

于 2012-09-19T23:25:12.593 に答える
3

おそらく、どのテーブルのどの行をハイライトするか(およびどのように)を決定できる、ある種の「ハイライトモデル」を使用するでしょう。

次に、これをセルレンダラーに直接提供するか、セルレンダラーのテーブルから直接抽出します(ただし、これは、テーブルが正しいタイプであり、ワームの缶全体を開くことを前提としています)。

つまり、基本的には次のような結果になる可能性があります...

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    // Seed the component with the default values
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    // You may need to change the value of the component to reflect what
    // you want to display here

    // It should be noted, that this method will override the selection
    // highlighting, you may want to check isSelected and make
    // your own decisions over what needs to be done.
    HighlightModel model = getHighlightModel();
    // You should check for null
    Color color = model.getHighlightBackgroundFor(table, row);
    if (color != null) {
        setOpaque(true);
        setBackground(color);
    }

    return this; // Assuming you've used a component as a base renderer ;)

}
于 2012-09-19T23:25:19.287 に答える
3

SwingXインフラストラクチャを使用すると、

  • セルではないものを強調表示するかどうかを決定するHighlightPredicateを実装します
  • 蛍光ペン(背景色を設定して装飾するColorHighlighter)をインスタンス化し、両方のテーブルに追加します
  • 状態に応じて、述語を蛍光ペンに設定するリスナーを実装/登録します

以下は、リスト内の選択されたアイテムで構成されたEqualsHighlightPredicateを使用して、同じコンテンツを持つすべてのセルを強調表示する短いスニペットです。楽しみ!

final JXList list = new JXList(AncientSwingTeam.createNamedColorListModel());
JXTable table = new JXTable(new AncientSwingTeam());
final ColorHighlighter highlighter = new ColorHighlighter(
        HighlightPredicate.NEVER, Color.YELLOW, null);
list.addHighlighter(highlighter);
table.addHighlighter(highlighter);
ListSelectionListener l = new ListSelectionListener() {

    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting()) return;
        highlighter.setHighlightPredicate(
                createPredicate(list.getSelectedValue()));
    }

    private HighlightPredicate createPredicate(Object selectedValue) {
        if (selectedValue == null) return HighlightPredicate.NEVER;
        return new HighlightPredicate.EqualsHighlightPredicate(selectedValue);
    }
};
list.getSelectionModel().addListSelectionListener(l);
于 2012-09-20T09:55:18.717 に答える