在开始之前,我查看了一些解决方案和文档。我似乎不明白为什么我的代码没有按我认为应该的方式工作。我已经扩展了DefaultTableCellRenderer,但我不相信它正在被应用——否则我就把事情搞砸了。
以下是我在发布此问题之前查看过的帖子/网站:
我意识到第一个链接使用HTML来更改字体颜色,但我认为我这样做应该会产生相同的结果。
为了让那些想帮助我解决问题的人更容易,我创建了一个SSCCE。
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class TableTest {
private static final int IMPORTANT_COLUMN = 2;
public static void createAndShowGUI() {
Object[][] data = new Object[2][4];
//create sample data
String[] realRowData = { "1", "One", "1.0.2", "compile" };
String[] fakeRowData = { "2", "Two", "1.3.2-FAKE", "compile" };
//populate sample data
for(int i = 0; i < realRowData.length; i++) {
data[0][i] = realRowData[i];
data[1][i] = fakeRowData[i];
}
//set up tableModel
JTable table = new JTable();
table.setModel(new DefaultTableModel(data,
new String[] { "ID #", "Group #", "version", "Action" })
{
Class[] types = new Class[] {
Integer.class, String.class, String.class, String.class
};
boolean[] editable = new boolean[] {
false, false, true, false
};
@Override
public Class getColumnClass(int columnIndex) {
return types[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return editable[columnIndex];
}
});
//set custom renderer on table
table.setDefaultRenderer(String.class, new CustomTableRenderer());
//create frame to place table
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setMinimumSize(new Dimension(400, 400));
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(table);
f.add(scrollPane);
f.pack();
f.setVisible(true);
}
//MAIN
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
//Custom DefaultTableCellRenderer
public static class CustomTableRenderer extends DefaultTableCellRenderer {
public Component getTableCellRenderer(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
String versionVal = table.getValueAt(row, IMPORTANT_COLUMN).toString();
if(versionVal.contains("FAKE")) {
//set to red bold font
c.setForeground(Color.RED);
c.setFont(new Font("Dialog", Font.BOLD, 12));
} else {
//stay at default
c.setForeground(Color.BLACK);
c.setFont(new Font("Dialog", Font.PLAIN, 12));
}
return c;
}
}
}
我的目标是突出显示版本列中包含红色粗体文本中单词false
的任何值。
用以下内容替换自定义表格单元格。
解释在评论中。基本上,您应该覆盖getTableCellRendererComponent
,然后检查正确的列(可能有其他方法来代替检查标头值),然后根据颜色设置单元格。
如果不是所需的列,请不要忘记最后一个else块将颜色设置为默认值。
//Custom DefaultTableCellRenderer
public static class CustomTableRenderer extends DefaultTableCellRenderer {
// You should override getTableCellRendererComponent
@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);
// Check the column name, if it is "version"
if (table.getColumnName(column).compareToIgnoreCase("version") == 0) {
// You know version column includes string
String versionVal = (String) value;
if (versionVal.contains("FAKE")) {
//set to red bold font
c.setForeground(Color.RED);
c.setFont(new Font("Dialog", Font.BOLD, 12));
} else {
//stay at default
c.setForeground(Color.BLACK);
c.setFont(new Font("Dialog", Font.PLAIN, 12));
}
} else {
// Here you should also stay at default
//stay at default
c.setForeground(Color.BLACK);
c.setFont(new Font("Dialog", Font.PLAIN, 12));
}
return c;
}
}
我已经扩展了DefaultTableCellRenderer,但我不相信它正在被应用
一些简单的调试提示:
@Overide
注释(您在TableModel类中使用了它,但没有使用您的渲染器类)。您的问题是输入错误,因为您没有覆盖正确的方法:
@Override
// public Component getTableCellRenderer(...) // this is wrong
public Component getTableCellRendererComponent(...)
重写注释将显示编译消息。在更改代码之前尝试一下。
此外,第一列不是整数类。仅仅因为它包含整数的字符串表示形式,并不能使它成为整数。您需要将整数对象添加到模型中。
我试图在我的文档末尾设置一个新表,并根据我的规格将其格式化。但是背景色和文本色似乎不起作用。字体大小也不完全是我想要的,因为它适用于整个表格,而不仅仅是一个单元格。 这就是我到目前为止所做的: 我想要表格的第一行没有边框,字体14,粗体,灰色背景上的白色文本。
问题内容: 我想制作一个可编辑的表,然后检查数据以确保其有效。我不确定如何仅更改一个单元格的颜色。我想要一个单元格,例如(0,0)并将前景颜色设置为红色。我已经阅读了SO和Oracle上有关自定义ColorRenderer的其他文章,但是我不知道如何使用它。 谢谢。 问题答案: 假设您要用其他颜色渲染的单元格代表一种状态(我将以“拒绝并批准”为例)。然后,我将在我的表模型中实现一个名为getSta
问题内容: 我试图使自己熟悉JTables,TableModels,JTableHeaders,渲染器等。我试图制作一个简单的虚拟表(出于练习目的),看起来像这样: 我还希望B2单元格-并且只有该单元格-具有蓝色(Color.BLUE)背景-所有其他单元格都可以具有自动分配的Swing默认颜色。 我的代码在下面,并且基于我在本网站和整个互联网上发现的无数示例。但是我没有得到想要的结果。相反,我得到
我可以在ApachePOI中使用以下代码更改前景色。现在我想更改单个单元格的字体颜色。 我已经试过了,但它并没有改变前两列的颜色 代码:
我试图弄清楚如何更改JTable中一行中单词的颜色。 例如,这是我的句子,在一行中; dmpsrv日志“2013年3月12日星期二15:33:03”(格林尼治标准时间)(DB=SS@2)pid=662node=“B2-W4”执行时间=1(s) 每一行的结构都是相同的,我想用粗体显示用户名。 但是我不知道我该怎么做?有人给点诡计吗? 谢谢
问题内容: 我在GUI应用程序中使用JTable作为网格来表示游戏的位置。我希望代表对象某个位置的表的单元格具有某种颜色,并且在某些操作上希望移动的对象(即在Grid / JTable中四处移动的颜色单元格)。我知道我可以通过创建一个可扩展的类来更改单元格的颜色,这是唯一的方法吗?还是有一种更简单的方法来改变单元格颜色?对于这样的应用程序,JXTable是否比JTable好? 编辑: 我没有包括以