如何更改具有特定列值的 JTable 整行的颜色
Posted
技术标签:
【中文标题】如何更改具有特定列值的 JTable 整行的颜色【英文标题】:How to change the color of a JTable entire row having a particular column value 【发布时间】:2013-03-14 12:28:01 【问题描述】:我有一个从值数组填充的 Jtable。 我的代码是这样的:
private static final String[] columnNames = "Line Number", "Error","Fix Proposed","Percentage (%)";
static DefaultTableModel model = new DefaultTableModel(null,columnNames);
public static void DisplayMyJList(List<CaptureErrors> x,String extension,
ArrayList<Integer> l,ArrayList<Integer> p,
ArrayList<String> e,ArrayList<String> s) throws IOException //Method to Dynamic get values to be populated in Jtable.
String theExtension = extension;
if(FILE_EXTENSION.equals("java"))
for(CaptureErrors ex: x)
Vector row = new Vector();
row.add(ex.getLinenumber());
row.add(ex.getMyfounderror());
row.add(ex.getMycorrection());
row.add(ex.getMyPercentage()+"%");
model.addRow( row );
//model.setRowColour(1, Color.YELLOW);
table = new JTable(model);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setFillsViewportHeight(true);
table.setShowGrid(true);
table.setShowVerticalLines(true);
table.setGridColor(new Color(0,128,0));
JTableHeader header = table.getTableHeader();
table.setBackground(new Color(255,228,225));
table.setEnabled(true);
header.setFont(new Font("Dialog", Font.CENTER_BASELINE, 12));
header.setBackground(Color.black);
header.setForeground(Color.yellow);
JScrollPane pane4 = new JScrollPane(table);
我可以使用 JButton 从值数组中填充 Jtable。 我想要一个条件,如果列“百分比”,获取该列中的所有值 >30,它会将行突出显示为 color.red。
我不想使用 TableCellRendererComponent 。我希望在单击 Jbutton 时执行此操作。
实际的 Jtable 如下所示:
然后根据我想要得到的,前2行应该用红色突出显示。任何帮助表示赞赏。
【问题讨论】:
您的表将所有数据视为字符串。您确实应该重写getColumnClass()
方法以返回正确的类,以便可以正确格式化每一列。
【参考方案1】:
请参阅Table Row Rendering 中的方法以获取无需创建自定义渲染器的解决方案。
您可能还想查看Table Format Renderers,以便轻松设置百分比列的格式。
【讨论】:
【参考方案2】:您可以创建自定义单元格渲染器。在其实现中,检查给定行的百分比值是否 > 30,然后突出显示该单元格。
例如:
class SomeRenderer extends DefaultTableCellRenderer
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 (isHighlightingEnabled)
Integer percentage = (Integer) table.getValueAt(row, 3);
if (percentage > 30)
c.setBackground(Color.RED);
return c;
如果需要,您可以在操作时启用/禁用此呈现逻辑。
请参阅Using Custom Renderers 了解更多详情。
【讨论】:
【参考方案3】:渲染 API 的一个问题是很难提供复合渲染器。有很多方法可以做,不要误会我的意思,但如果能内置它会很好...[end rant]...
基本思想是您要设置一系列从基础渲染器扩展而来的渲染器,其中包含确定在所需条件下应该做什么所需的逻辑。
public class FilterRenderer extends 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);
Double percent = (Double) table.getValueAt(row, 3);
// You'll need some way to supply the filter value, may via a centralised
// manager of some kind.
if (percent > 0.3 && !isSelected)
setOpaque(true);
setBackground(Color.RED);
else
setOpaque(false);
return this;
public class OtherCellRenderer extends FilterRenderer
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
// Apply any special renderer requirements, like translating an object value to String
return this;
您需要为每一列(在您的示例中为 4)提供一个自定义渲染器,并将每个渲染器应用于表格列
TableColumnModel model = table.getColumnModel();
model.getColumn(0).setCellRenderer(new LineNumberRenderer());
model.getColumn(1).setCellRenderer(new ErrorRenederer());
model.getColumn(2).setCellRenderer(new FixProposedRenderer());
model.getColumn(3).setCellRenderer(new Percentage());
或者您也可以使用 SwingLabs JXTable
,它内置了对行高亮显示的支持
【讨论】:
以上是关于如何更改具有特定列值的 JTable 整行的颜色的主要内容,如果未能解决你的问题,请参考以下文章