22

3列のJTableがあります。私はTableCellRendererこのように3つの列すべてにを設定しました(多分あまり効果的ではありませんか?)。

 for (int i = 0; i < 3; i++) {
     myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
 }

getTableCellRendererComponent()、各行の背景色がランダムなコンポーネントを返します。
プログラムの実行中に背景を他のランダムな色に変更するにはどうすればよいですか?

4

5 に答える 5

28

リチャード・ファーンの答えの再開者、各2行目を灰色にする:

jTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        return c;
    }
});
于 2012-07-19T09:53:50.167 に答える
23

1つの方法は、モデル内の各行の現在の色を保存することです。これは、3列3行に固定された単純なモデルです。

static class MyTableModel extends DefaultTableModel {

    List<Color> rowColours = Arrays.asList(
        Color.RED,
        Color.GREEN,
        Color.CYAN
    );

    public void setRowColour(int row, Color c) {
        rowColours.set(row, c);
        fireTableRowsUpdated(row, row);
    }

    public Color getRowColour(int row) {
        return rowColours.get(row);
    }

    @Override
    public int getRowCount() {
        return 3;
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public Object getValueAt(int row, int column) {
        return String.format("%d %d", row, column);
    }
}

setRowColour呼び出しに注意してくださいfireTableRowsUpdated; これにより、テーブルのその行だけが更新されます。

レンダラーはテーブルからモデルを取得できます。

static class MyTableCellRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        MyTableModel model = (MyTableModel) table.getModel();
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(model.getRowColour(row));
        return c;
    }
}

行の色の変更は次のように簡単です。

model.setRowColour(1, Color.YELLOW);
于 2010-10-06T18:41:54.480 に答える
15

すべての列で同じレンダラーを使用するため、ここに示す他の回答はうまく機能します。

ただし、一般的にJTableを使用する場合、各列に異なるタイプのデータがあるため、各列に同じレンダラーを使用することはないと思いがちです。このような場合、テーブル行レンダリングのアプローチが役立つ場合があります。

于 2010-10-07T02:33:46.913 に答える
1

これは基本的にテーブルを塗り直すのと同じくらい簡単です。ただし、1つの行/列/セルだけを選択的に再描画する方法は見つかりませんでした。

この例では、ボタンをクリックすると行の背景色が変更され、repaintが呼び出されます。

public class TableTest {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Color[] rowColors = new Color[] {
                randomColor(), randomColor(), randomColor()
        };
        final JTable table = new JTable(3, 3);
        table.setDefaultRenderer(Object.class, new TableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus,
                    int row, int column) {
                JPanel pane = new JPanel();
                pane.setBackground(rowColors[row]);
                return pane;
            }
        });
        frame.setLayout(new BorderLayout());

        JButton btn = new JButton("Change row2's color");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                rowColors[1] = randomColor();
                table.repaint();
            }
        });

        frame.add(table, BorderLayout.NORTH);
        frame.add(btn, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    private static Color randomColor() {
        Random rnd = new Random();
        return new Color(rnd.nextInt(256),
                rnd.nextInt(256), rnd.nextInt(256));
    }
}
于 2010-10-06T18:33:46.530 に答える
1

の呼び出しにgetTableCellRendererComponent(...)は、レンダラーが求められているセルの値が含まれます。

その値を使用して色を計算できます。AbstractTableModelも使用している場合は、任意のタイプの値をレンダラーに提供できます。

色をsetBackground()取得したら、返すコンポーネントを使用できます。

于 2010-10-06T18:51:37.977 に答える