颜色JTable行

时间:2014-10-02 13:15:28

标签: java jtable

我在函数中使用TableCellRenderer来更改行的颜色。

public void change_color(JTable tableName){ 
 tableName.setDefaultRenderer(Object.class, new TableCellRenderer(){
    private DefaultTableCellRenderer DEFAULT_RENDERER =  new DefaultTableCellRenderer();

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

                    c.setBackground(Color.RED);


       //Add below code here
                return c;
            }

        });

 }   

它会改变整个表格的颜色。要调用此函数,请使用以下条件。

if(ellapsed.getMinutes() > 30)
            {
           change_color(table_dineIn,ellapsed.getMinutes());
            }

无法弄清楚问题所在。我尝试了其他代码但没有帮助我。

2 个答案:

答案 0 :(得分:0)

JTableJList等中的单元格渲染器使用,如邮票(有关详细信息,请参阅Editors and Renderers)。

这意味着通常,相同的(相同)JComponent用于绘制所有单元格。在用于绘制单元格之前,此组件仅填充适当的内容。当背景设置为RED时,它将保持红色,直到将其设置为不同的颜色。

我不确定您希望通过使用此DEFAULT_RENDERER实例实现的目标。您可以直接从DefaultTableCellRenderer继承并直接返回组件(实际上是渲染器本身)。但是,在任何情况下,您都必须包含一些代码,以确保为每个调用设置适当的颜色,大致类似于

....
if (shouldBeRed(row, column)) {
    c.setBackground(Color.RED);
} else {
    c.setBackground(notRed);
}
return c;

(请注意,如果您延长super,这实际上可以隐藏在对DefaultTableCellRenderer方法的调用中,但此处的详细信息取决于您是否保留此DEFAULT_RENDERER实例与否...)

您可能也对this example of blinking table cells感兴趣,显示如何根据特定条件为多个表格单元格指定不同的颜色。


编辑:一个例子。虽然我通常试图通过这样的例子避免回答这样的问题,因为即使对于最轻微的修改,你也会问另一个问题,在这种情况下可能会在

  • 如何取消突出显示行
  • 如何突出显示多行
  • 如何突出显示不同颜色的多行
  • ...

您可以在https://stackoverflow.com/a/24556135/3182664中找到所有这些问题的答案 - 与此同时,我会将此问题标记为重复。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;

public class TableRowColor 
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("TableRowColor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().setLayout(new BorderLayout());

        final JTable table = createTable();
        JScrollPane scrollPane = new JScrollPane(table);
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

        JButton changeColorButton = new JButton("Change color");
        changeColorButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                changeColor(table, 1);
            }
        });
        frame.getContentPane().add(changeColorButton, BorderLayout.SOUTH);

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

    private static JTable createTable()
    {
        String[] columnNames = { "First Name", "Last Name", "Sport", };
        Object[][] data = { { "Kathy", "Smith", "Snowboarding" },
            { "John", "Doe", "Rowing" }, { "Sue", "Black", "Knitting" },
            { "Jane", "White", "Speed reading" }, { "Joe", "Brown", "Pool" } };
        return new JTable(data, columnNames);
    }

    public static void changeColor(JTable table, final int coloredRow)
    {
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
        {
            @Override
            public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column)
            {
                super.getTableCellRendererComponent(table, value, isSelected,
                    hasFocus, row, column);
                if (row == coloredRow)
                {
                    setBackground(Color.RED);
                }
                else
                {
                    setBackground(null);
                }
                return this;
            }
        });
        table.repaint();

    }

}

答案 1 :(得分:-2)

以下内容将为表格的第30行着色:

public void change_color(JTable tableName){ 
 tableName.setDefaultRenderer(Object.class, new TableCellRenderer(){
    private DefaultTableCellRenderer DEFAULT_RENDERER =  new DefaultTableCellRenderer();

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
               if (row == 30) {
                   c.setBackground(Color.RED);
                }      
                return c;
            }

        });

 }   

编辑:

如果要根据数据选择表格颜色,请将该数据添加到表格模型(例如,特定列中存储的时间),然后在渲染器中使用该模型。例如:

static final int TIME_ELLAPSED_COL = ...;
...
if (((Time) table.getModel().getValueAt(row, TIME_ELLAPSED_COL)).getMinutes() > 30) {
   c.setBackground(Color.RED);
}
...