JTable 单元格颜色
Posted
技术标签:
【中文标题】JTable 单元格颜色【英文标题】:JTable Cell Color 【发布时间】:2012-10-03 09:45:58 【问题描述】:谁能给我一个示例,说明如何获取 JTable 中特定单元格的背景颜色?我找不到如何执行此操作的示例。获取单元格中的值而不是单元格的背景颜色的大量示例。
【问题讨论】:
在阅读完答案后,我注意到我误解了你的问题;-) 即使是现在,这仍然是一个次优问题:没有上下文和更多细节(fi 为什么,你想达到什么目标,在哪里/你究竟是如何获得颜色的......)很难正确回答...... 【参考方案1】:应该是这样的(根据所有cmets固定):
重要提示:使用 table.prepareRenderer(...) 让 JTable 为您完成所有工作
public Color getTableCellBackground(JTable table, int row, int col)
TableCellRenderer renderer = table.getCellRenderer(row, col);
Component component = table.prepareRenderer(renderer, row, col);
return component.getBackground();
完整演示:
public class TableRenderDemo extends JPanel
public TableRenderDemo()
super(new GridLayout(1, 0));
final JTable table = new JTable(new MyTableModel());
table.setPreferredScrollableViewportSize(new Dimension(600, 200));
table.setFillsViewportHeight(true);
table.setDefaultRenderer(Object.class, new MyRenderer());
table.addMouseListener(new MouseAdapter()
public void mouseClicked(MouseEvent e)
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
JOptionPane.showInternalMessageDialog(TableRenderDemo.this,
"Color: " + getTableCellBackground(table, row, col));
System.out.println("Color: " + getTableCellBackground(table, row, col));
);
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
public Color getTableCellBackground(JTable table, int row, int col)
TableCellRenderer renderer = table.getCellRenderer(row, col);
Component component = table.prepareRenderer(renderer, row, col);
return component.getBackground();
class MyRenderer implements TableCellRenderer
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
JTextField editor = new JTextField();
if (value != null)
editor.setText(value.toString());
editor.setBackground((row % 2 == 0) ? Color.white : Color.BLUE);
return editor;
class MyTableModel extends AbstractTableModel
private String[] columnNames = "First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian";
private Object[][] data =
"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false),
"John", "Doe",
"Rowing", new Integer(3), new Boolean(true),
"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false),
"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true),
"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)
;
public final Object[] longValues = "Jane", "Kathy",
"None of the above",
new Integer(20), Boolean.TRUE;
public int getColumnCount()
return columnNames.length;
public int getRowCount()
return data.length;
public String getColumnName(int col)
return columnNames[col];
public Object getValueAt(int row, int col)
return data[row][col];
private static void createAndShowGUI()
JFrame frame = new JFrame("TableRenderDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableRenderDemo newContentPane = new TableRenderDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
public static void main(String[] args)
javax.swing.SwingUtilities.invokeLater(new Runnable()
public void run()
createAndShowGUI();
);
【讨论】:
我尝试了这个示例,并遵循逻辑,但由于某种原因,每个单元格得到 255,255,255,但我有备用行着色,所以我不确定这里发生了什么。跨度> user1154644 你搜了吗,有XxxCellRenderer和PrepareRenderer,而且这段代码没有设置任何Color,也没有给Cell BackGround...,只有骨架的 行高亮是如何应用的? 请在里面找到可运行演示的更新答案。我分别得到 Color: java.awt.Color[r=0,g=0,b=255] 和 Color: java.awt.Color[r=255,g=255,b=255] 已修复。手动配置 tableRenderer 真的是不必要的。谢谢大家。【参考方案2】:谁能给我一个示例,说明如何获取 JTable 中特定单元格的背景颜色?我找不到如何执行此操作的示例。
TableCellRenderer 或Renderer,
但一切都基于JTable tutorial,尤其是Editors and Renderers和Custom Renderers的一部分
很多例子here和here
关于获取单元格中的值,而不是单元格的背景颜色的大量示例。
实在忍不住了,请到这个论坛或者什么地方
希望对你有所帮助....
【讨论】:
【参考方案3】:要在单元格0, 0
处获取JTable
颜色,您可以获取单元格组件的背景颜色:
TableCellRenderer cellRenderer = table.getCellRenderer(0, 0);
Component rendererComponent = cellRenderer.getTableCellRendererComponent(table, null, false, true, 0, 0);
Color cellColor = rendererComponent.getBackground();
【讨论】:
如果使用带有一些棘手的基于值的逻辑的自定义渲染器或选择了行,将无法工作。 如果您将正确的行/列传递给 table.getCellRenderer,它将起作用 错了......这不会让你得到table配置后的颜色,见my comment【参考方案4】:使用 TableCellRenderer
jTable1 = new javax.swing.JTable(6,6)
public Component prepareRenderer(
TableCellRenderer renderer, int row, int column)
Component c = super.prepareRenderer(renderer, row, column);
if(column==2 && row==4)
Color color= c.getBackground();// use setBackground to set color and get background to get background of a particular cell
System.out.println("Color of row=0 and column=0 is "+color);
else
c.setBackground(Color.GREEN);
setShowGrid(true);
return c;
;
【讨论】:
没有回答问题(这并不太清楚,承认:-) 你注意到 System.out.println();语句无限执行?我相信方法 prepareRenderer 以某种方式被递归调用。即使您使用“纯”JTable 类的对象而不是您的自定义版本,这是否也是预期的行为? @Prashan 我很久以前就回答过了,我明白答案并不完美。我现在和swing没有联系。是的,我知道答案并不完美。我在摇摆上失去了联系,现在我在 android 上编程。 我只是避免了递归。用以下代码替换 setShowGrid(true) 语句: boolean oldHorizontalVal = this.showHorizontalLines;显示水平线=真; firePropertyChange("showHorizontalLines", oldHorizontalVal, showHorizontalLines); boolean oldVerticalVal = this.showVerticalLines;显示垂直线=真; firePropertyChange("showVerticalLines", oldVerticalVal, showVerticalLines);以上是关于JTable 单元格颜色的主要内容,如果未能解决你的问题,请参考以下文章