簡體   English   中英

更改JTable中行的背景顏色

[英]Change the background color of a row in a JTable

我有一個有3列的JTable。 我已經像這樣為所有3列設置了TableCellRenderer (可能不是很有效?)。

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

getTableCellRendererComponent()返回每行具有隨機背景顏色的Component。
在程序運行時如何將背景更改為其他隨機顏色?

Richard Fearn的回答,讓每一行都變成灰色:

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;
    }
});

一種方法是存儲模型中每行的當前顏色。 這是一個固定在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);

這里給出的其他答案很有效,因為您在每列中使用相同的渲染器。

但是,我傾向於認為通常在使用JTable時,每個列中將包含不同類型的數據,因此您不會為每列使用相同的渲染器。 在這些情況下,您可能會發現表行渲染方法很有幫助。

這基本上就像重新繪制表格一樣簡單。 我還沒有找到一種方法來選擇性地重新繪制一行/列/單元格。

在此示例中,單擊按鈕可更改行的背景顏色,然后調用重繪。

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));
    }
}

getTableCellRendererComponent(...)的調用包括為其尋找渲染器的單元格的值。

您可以使用該值來計算顏色。 如果您還使用AbstractTableModel,則可以為渲染器提供任意類型的值。

獲得顏色后,可以在要返回的組件上設置setBackground()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM