Java jtable cellrenderer在运行时更改单元格的背景颜色
我正在尝试创建一个表,并根据其他列的内容创建特定于颜色的单元格(黄色、红色或白色)。为此,我在各行中循环填充值,然后检查内容。这对于屏幕上当前显示的每一行都很好,但是当程序到达未显示的行时,或者如果用户尝试滚动每个单元格,则会将其背景色更改为白色。我在网上搜索过解决方案,唯一听起来合理的想法是在每次循环后重置cellRenderer,这不起作用,因为它也会重置每个单元格 我希望有人知道这个问题的解决方案,或者能给我一个想法,我在什么事情上迷茫了 我正在使用这个循环Java jtable cellrenderer在运行时更改单元格的背景颜色,java,swing,jtable,background-color,tablecellrenderer,Java,Swing,Jtable,Background Color,Tablecellrenderer,我正在尝试创建一个表,并根据其他列的内容创建特定于颜色的单元格(黄色、红色或白色)。为此,我在各行中循环填充值,然后检查内容。这对于屏幕上当前显示的每一行都很好,但是当程序到达未显示的行时,或者如果用户尝试滚动每个单元格,则会将其背景色更改为白色。我在网上搜索过解决方案,唯一听起来合理的想法是在每次循环后重置cellRenderer,这不起作用,因为它也会重置每个单元格 我希望有人知道这个问题的解决方案,或者能给我一个想法,我在什么事情上迷茫了 我正在使用这个循环 for(int e = 0;
for(int e = 0; e < modules.size(); e++)
{
gui.clearOutputStream();
gui.getOutputStream().setText("Load Modul " + modules.get(e) + "\r\n");
version = getVersion(modules.get(e));
//Update current Row
updateRow(gui.getReleaseTabelle(), e);
}
这是我的客户服务
class CustomRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = 6703872492730589499L;
public String Val1;
public JTable tab;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(tab.getValueAt(row, 1).equals("Y")){
cell.setBackground(new java.awt.Color(255, 255, 0));
tab.setValueAt(Val1, row, 1);
}
else if(tab.getValueAt(row, 1).equals("X")){
cell.setBackground(new java.awt.Color(255, 50, 50));
tab.setValueAt(Val1, row, 1);
}
else
{
//do nothing
}
return cell;
}
}
不要更新CutomRenderer类中的表数据。
您的渲染器
类应该检查条件并为单元格着色。我已经使用了您的CustomRenderer
类,并根据单元格中的数据渲染了单元格。如果单元格的数据为“Y”,则将其涂成黄色。如果数据为“N”,则将其颜色设置为灰色
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 ColoringCells {
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(table.getValueAt(row, column).equals("Y")){
cellComponent.setBackground(Color.YELLOW);
} else if(table.getValueAt(row, column).equals("N")){
cellComponent.setBackground(Color.GRAY);
}
return cellComponent;
}
}
为了获得更好的帮助,请尽快在CustomRenderer类选项卡中发布一个简短的、可运行的、可编译的setValueAt(Val1,row,1);有。为什么需要这个声明?您应该仅将CustomRenderer类用于渲染颜色。您正在重置表中的某些内容。这可能就是问题所在。但是,当程序到达未显示的行时,或者如果用户尝试滚动每个单元格,则会将其背景颜色更改回白色。有些地方你的逻辑是错误的,这导致了问题。永远不要在渲染器中更改表/模型好的,在你们告诉我不要在渲染器中更改表上的任何内容后,我找到了一个解决方案,这迫使我不去管这些值,而是从渲染器中检查其他列(table.getValueAt(row,column)完全可以这样做,我还必须编辑cell.setBackground(new java.awt.Colo(255,255,255))的最后一个else,而不是什么都不做。因此,我的上一个假设是正确的,但如果没有您的评论,我永远不会有这个想法。谢谢Che和kleopatra:)
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 ColoringCells {
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(table.getValueAt(row, column).equals("Y")){
cellComponent.setBackground(Color.YELLOW);
} else if(table.getValueAt(row, column).equals("N")){
cellComponent.setBackground(Color.GRAY);
}
return cellComponent;
}
}