我在函数中使用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());
}
无法弄清楚问题所在。我尝试了其他代码但没有帮助我。
答案 0 :(得分:0)
JTable
,JList
等中的单元格渲染器使用,如邮票(有关详细信息,请参阅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);
}
...