为JTable行添加颜色

时间:2014-11-17 18:23:42

标签: java swing colors jtable

我想更改JTable行的颜色。

当我在JTable中设置一行时,第一行变为RED颜色。然后当我想要添加新行时,第一行变为黄色,第二行变为红色;

red JTable row yellow red JTable row

我不使用重绘()Becouse重绘所有时间的工作。我只需要一次。当我使用repaint或tablemodel.setfile ...表不断更新

1 个答案:

答案 0 :(得分:2)

可以使用custom cell renderer完成此操作。

单元格渲染器负责创建单元格实际显示的组件。 (单元格渲染器组件实际上已添加到JTable。JTable只是用它来进行绘画。)DefaultTableCellRenderer创建JLabel,以便您可以自由设置其背景和前景色。你不需要做画。

one two

您可以随心所欲地显示单元格。

,我不确定你希望它如何照看两行。

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

public class CustomCellRenderer implements Runnable, ActionListener {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new CustomCellRenderer());
    }

    JTable table;

    @Override
    public void run() {
        JFrame frame = new JFrame("Custom Cell Renderer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        table = new JTable(new DefaultTableModel(0, 2) {
            @Override
            public Class<?> getColumnClass(int c) {
                return Object.class;
            }
        });

        class RedYellowRenderer extends DefaultTableCellRenderer {
            RedYellowRenderer() {
                setHorizontalAlignment(CENTER);
            }
            @Override
            public Component getTableCellRendererComponent(
                JTable table, Object value,
                boolean isSelected, boolean hasFocus,
                int row, int column
            ) {
                Component c = super.getTableCellRendererComponent(
                    table, value, isSelected, hasFocus, row, column
                );

                if(row == 0 && table.getRowCount() > 1) {
                    c.setBackground(Color.YELLOW);
                    c.setForeground(Color.BLACK);
                } else {
                    c.setBackground(Color.RED);
                    c.setForeground(Color.WHITE);
                }

                return c;
            }
        }

        table.setDefaultRenderer(Object.class, new RedYellowRenderer());
        table.setTableHeader(null);

        JButton btn = new JButton("Add Row");
        btn.addActionListener(this);

        JToolBar bar = new JToolBar();
        bar.setFloatable(false);
        bar.add(btn);

        JPanel content = new JPanel(new BorderLayout());
        content.add(bar, BorderLayout.NORTH);
        content.add(new JScrollPane(table), BorderLayout.CENTER);

        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        int nextRow = table.getRowCount();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addRow(new Object[] { "NAME" + nextRow, "SPORT" + nextRow });
    }
}