Java 彩色表格单元格
我想根据第1列中的值为表格单元格着色,如果值不等于第1列中的值,则颜色应为青色,但我的代码不起作用:Java 彩色表格单元格,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我想根据第1列中的值为表格单元格着色,如果值不等于第1列中的值,则颜色应为青色,但我的代码不起作用: table = new JTable(){ public TableCellRenderer getCellRenderer(int row, int column) { TableCellRenderer tcr=null; Color c; if(column>=1&&
table = new JTable(){
public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer tcr=null;
Color c;
if(column>=1&&getValueAt(row, column)!=null &&getValueAt(row, 1)!=null &&!getValueAt(row, column).equals(getValueAt(row, 1)))
c=Color.CYAN;
else
c=Color.white;
if(getValueAt(row, column) instanceof Boolean) {
tcr= super.getDefaultRenderer(Boolean.class);
} else {
tcr= super.getCellRenderer(row, column);
}
tcr.getTableCellRendererComponent(this, getValueAt(row, column), isCellSelected(row, column) , hasFocus(), row, column).setBackground(c);
return tcr;
}
public TableCellEditor getCellEditor(int row, int column) {
if(getValueAt(row, column) instanceof Boolean) {
return super.getDefaultEditor(Boolean.class);
} else {
return super.getCellEditor(row, column);
}
}
};
table.setModel(new DefaultTableModel(
new Object[][] {
{"Row1", "1","2","3"},
{"Row2", "2","2","3"},
{"Row3", "2","2","2"},
{"Row3", "2","1","2"}
},
new String[] {"Header1", "Header2","Header3","Header4"}
));
必须在TableCellRenderer中决定是否必须高亮显示单元格。它不能在JTable中生成。因此(可能)没有理由重写JTable中的方法。相反,您可以将列的CellRenderer设置为您自己的TableCellRenderer实现 在本例中,第2列和第3列接收“ColoringCellRenderer”。如果某个单元格中的值不为null且与第1列中的值相同,则此ColoringCellRenderer将高亮显示该单元格
import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class ColoredTableCells
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.getContentPane().add(new JScrollPane(createTable()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
static JTable createTable()
{
class ColoringTableCellRenderer extends DefaultTableCellRenderer
{
ColoringTableCellRenderer()
{
setOpaque(true);
}
@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 (highlightCell(table, row, column))
{
setBackground(Color.CYAN);
}
else
{
setBackground(Color.WHITE);
}
return this;
}
private boolean highlightCell(JTable table, int row, int column)
{
Object thisValue = table.getValueAt(row, column);
Object referenceValue = table.getValueAt(row, 1);
if (thisValue != null && referenceValue != null)
{
return thisValue.equals(referenceValue);
}
return false;
}
}
JTable table = new JTable();
table.setModel(new DefaultTableModel(new Object[][] {
{ "Row1", "1", "2", "3" },
{ "Row2", "2", "2", "3" },
{ "Row3", "2", "2", "2" },
{ "Row3", "2", "1", "2" } },
new String[] { "Header1", "Header2", "Header3", "Header4" }));
for (int i=2; i<table.getColumnCount(); i++)
{
TableColumn column = table.getColumnModel().getColumn(i);
column.setCellRenderer(new ColoringTableCellRenderer());
}
return table;
}
}
必须在TableCellRenderer中决定是否必须高亮显示单元格。它不能在JTable中生成。因此(可能)没有理由重写JTable中的方法。相反,您可以将列的CellRenderer设置为您自己的TableCellRenderer实现 在本例中,第2列和第3列接收“ColoringCellRenderer”。如果某个单元格中的值不为null且与第1列中的值相同,则此ColoringCellRenderer将高亮显示该单元格
import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class ColoredTableCells
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.getContentPane().add(new JScrollPane(createTable()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
static JTable createTable()
{
class ColoringTableCellRenderer extends DefaultTableCellRenderer
{
ColoringTableCellRenderer()
{
setOpaque(true);
}
@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 (highlightCell(table, row, column))
{
setBackground(Color.CYAN);
}
else
{
setBackground(Color.WHITE);
}
return this;
}
private boolean highlightCell(JTable table, int row, int column)
{
Object thisValue = table.getValueAt(row, column);
Object referenceValue = table.getValueAt(row, 1);
if (thisValue != null && referenceValue != null)
{
return thisValue.equals(referenceValue);
}
return false;
}
}
JTable table = new JTable();
table.setModel(new DefaultTableModel(new Object[][] {
{ "Row1", "1", "2", "3" },
{ "Row2", "2", "2", "3" },
{ "Row3", "2", "2", "2" },
{ "Row3", "2", "1", "2" } },
new String[] { "Header1", "Header2", "Header3", "Header4" }));
for (int i=2; i<table.getColumnCount(); i++)
{
TableColumn column = table.getColumnModel().getColumn(i);
column.setCellRenderer(new ColoringTableCellRenderer());
}
return table;
}
}
看起来您是在设置JTable的背景色,而不是渲染器?我更新了它,现在它可以工作了-1再次询问最常问的问题之一。。。。(懒得查找副本)看起来您是在设置JTable的背景色,而不是渲染器?我更新了它,我认为它现在可以工作了-1,再次提出了一个最常见的问题。。。。(懒得查找副本)不要同时理解Q和a,然后+1downvoters@mKorbel:我不理解你的评论;-)问题是“我想根据第1列中的值给表格单元格上色,如果值不等于第1列中的值,则颜色应为青色”-好的,如果它们相等,我的代码将它们上色为青色,但这可以用单个
修复
…@Marco13是否可以将彩色单元格与复选框的显示相结合,而不显示true和false?我的意思是,如果模型喜欢新对象[][]{{“Row1”、“1”、“2”、“3”}、{“Row2”、“2”、“3”}、{“Row3”、“2”、“2”、“2”}、{“Row4”、true、false、true},因为if(getValueAt(row,column)instanceof Boolean){返回super.getDefaultEditor(Boolean.class);使这样的复选框基本正确(+1)只是有点吹毛求疵:a)无需再次获取当前值,它作为参数传入b)渲染器最好是自动标记的,即不依赖于其他代码,不将自身设置为比较列的渲染器c)如果用户重新排列列d)没有视觉选择线索,则会中断(也不是像dnd这样的装饰)-但这实际上只是一个次要的旁注,完全可以,例如代码:-)@Jaran我添加了一个带有“新版本”的编辑,我想这就是你在评论中要求的。不要同时理解Q和a,然后+1downvoters@mKorbel当前位置我不理解你的评论;-)问题是“我想根据第1列中的值为表格单元格着色,如果值不等于第1列中的值,则颜色应为青色“-好的,如果它们相等,我的代码将它们涂成青色,但这可以通过单个!
…@Marco13是否可以将彩色单元格和复选框的显示组合起来,而不是真和假?我的意思是,如果模型喜欢新对象[][{{“Row1”、“1”、“2”、“3”},{“Row2”、“2”、“3”},{“Row3”,“2”,“2”,“2”},{“Row4”,true,false,true}}因为if(getValueAt(row,column)instanceof Boolean){return super.getDefaultEditor(Boolean.class);使这样的复选框基本正确(+1)只是有点吹毛求疵:a)无需再次获取当前值,它作为参数传入b)渲染器最好是autark,即不依赖其他代码,不将自身设置为比较列的渲染器c)如果用户重新排列列d)将中断,没有视觉选择线索(也没有其他装饰,如dnd)-但这实际上只是一个次要的旁注,非常好,例如代码:-)@Jaran我添加了一个带有“新版本”的编辑,我想这就是你在评论中要求的。