JTable 的单元格渲染器 - 彩色行
Posted
技术标签:
【中文标题】JTable 的单元格渲染器 - 彩色行【英文标题】:Cell Renderer for JTable - coloured rows 【发布时间】:2013-02-10 20:58:35 【问题描述】:我一直在寻找解决这个问题的方法,但如果不问我自己的问题,我无法从各个地方找出如何让我的桌子做彩色行的头或尾。
从我看过的每一个地方,我都需要使用单元格渲染器,但问题是我不知道如何将它应用到我自己的情况。
所以我有一个包含 3 列的简单 JTable,我只是希望每一行根据单独变量的值(未显示在表中)以绿色、黄色或红色突出显示。
看起来应该很简单,但我不知道该怎么做。如果有帮助,我的表定义如下:
studentTableModel = new DefaultTableModel(new Object[]"Name", "StudentNo", "Part", 0);
jt_studentTable = new JTable(studentTableModel);
jt_studentTable.getColumnModel().getColumn(2).setPreferredWidth(10);
studentTableModel.addRow(new Object[]"(empty)", "(empty)", "(empty)");
JScrollPane jsp_tableScroller = new JScrollPane(jt_studentTable);
jsp_tableScroller.setPreferredSize(new Dimension(200,190));
middleCentrePanel.add(jsp_tableScroller);
表格中的行会根据组合框的选择而变化。
提前致谢。
【问题讨论】:
这个answer 可以帮助你渲染你的细胞。 无关:never-ever call component.setXXSize Che,感谢您链接到的答案 - 除了它只突出显示它正在检查的单元格。你知道我会如何突出整行吗? 删除我使用的条件,只使用if(row == 0) use Color.Green; else use Color.Yellow;
之类的替代条件。这将用单一颜色高亮整行。但是使用约束来检查行应该如何着色。
【参考方案1】:
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class RowRendering
private static Object[] columnName = "Yes", "No";
private static Object[][] data =
"Y", "N",
"N", "Y",
"Y", "N"
;
public static void main(String[] args)
Runnable r = new Runnable()
@Override
public void run()
JFrame frame = new JFrame();
JTable table = new JTable(data, columnName);
table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer());
table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer());
frame.add(new JScrollPane(table));
frame.setTitle("Rendering in JTable");
frame.pack();
frame.setVisible(true);
;
EventQueue.invokeLater(r);
class CustomRenderer extends DefaultTableCellRenderer
private static final long serialVersionUID = 6703872492730589499L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(row == 0)
cellComponent.setBackground(Color.YELLOW);
else if ( row == 1)
cellComponent.setBackground(Color.GRAY);
else
cellComponent.setBackground(Color.CYAN);
return cellComponent;
【讨论】:
【参考方案2】:我只想根据单独变量的值(未显示在表格中)以绿色、黄色或红色突出显示每一行。
渲染器处理表中的数据。也就是说,组件只有在拥有完成工作所需的所有信息时才能绘制自己。
因此,您需要以某种方式将信息添加到表格中。这可以通过添加隐藏的第四列来完成。然后该表仍然可以访问所需的信息。
那么也许你可以使用Table Row Renderering中的建议。
【讨论】:
【参考方案3】:也许这对你有用:
class MyCellRenderer extends DefaultTableCellRenderer
String separatedVariable;
public MyCellRenderer(String separatedVariable)
this.separatedVariable = separatedVariable;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
c.setBackground(Color.WHITE);
c.setForeground(Color.BLACK);
JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
if (separatedVariable.equals("YOUR VALUE TO GREEN"))
l.setBackground(Color.GREEN);
return l;
else
if (separatedValue.equals("YOUR VALUE TO YELLOW"))
l.setBackground(Color.YELLOW);
return l;
else if (separatedValue.equals("YOUR VALUE TO RED"))
l.setBaground(Color.RED);
return l;
return c;
【讨论】:
嘿,感谢您的帮助,唯一的问题是解决方案只会更改它正在检查的一个单元格的颜色 - 我希望更改行中的所有单元格。你知道该怎么做吗? 如何设置单元格渲染器?尝试这样设置:table.setCellRenderer(MyCellRenderer);【参考方案4】:我也有同样的问题,但有点复杂,因为我已经为每列设置了几个不同的渲染器,具体取决于数据类型。
但我发现这很有魅力:
public class MyTable extends JTable
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
Component result = super.prepareRenderer(renderer, row, column);
if (mustBeYellow(row, column))
result.setBackground(Color.yellow);
return result;
private boolean mustBeYellow(int row, int column)
// implement this depending on your data..
return false;
【讨论】:
以上是关于JTable 的单元格渲染器 - 彩色行的主要内容,如果未能解决你的问题,请参考以下文章