【发布时间】:2011-10-02 11:05:10
【问题描述】:
我正在关注我找到的一些代码,(是的,我了解它是如何工作的) 来自这里:Code Link
如果单元格值设置为“黄色”,我要做的是设置单元格的前景色
这是我的代码:
public class Board extends JPanel{
private static final long serialVersionUID = 1L;
int boardHeight = 20;
int boardWidth = 10;
JTable table;
public Board() {
table = new JTable(this.boardHeight, this.boardWidth);
table.setDefaultRenderer(String.class, new BoardTableCellRenderer());
table.setFocusable(false);
table.setShowGrid(false);
table.setRowMargin(0);
table.setIntercellSpacing(new Dimension(0,0));
table.setRowSelectionAllowed(false);
table.setVisible(true);
this.add(table);
this.setPreferredSize(new Dimension(table.getPreferredSize().width, (table.getPreferredSize().height + 85)));
}
public void paint(Graphics g) {
table.setRowHeight(20);
for (int x = 0; x < this.table.getColumnCount(); ++x) {
TableColumn col = this.table.getColumnModel().getColumn(x);
col.setPreferredWidth(20);
}
}
}
还有细胞渲染器
public class BoardTableCellRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int col) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
String s = table.getModel().getValueAt(row, col).toString();
if (s.equalsIgnoreCase("yellow")) {
c.setForeground(Color.YELLOW);
}
else {
c.setForeground(Color.WHITE);
}
return c;
}
}
问题是它没有改变,如果我将任何单元格值设置为“黄色”
提前致谢!
【问题讨论】:
-
你不应该重写 JPanel 的paint 方法,而应该重写它的paintComponent 方法,不管怎样,你不应该从paint 或paintComponent 中调用程序逻辑。这表明您的代码需要大修。
-
这是因为最终我要让它随着窗口大小而拉伸,所以我需要更新它。
-
这不是你让它伸展的方式。同样,永远不要将代码逻辑放在这些方法中。您永远无法完全控制何时甚至是否调用此方法。如果您绝对需要监听调整大小事件(并且没有使用适当的布局管理器),那么您需要将 ComponentListener 添加到 JPanel。
-
好的,记得稍后重新编码。谢谢!
-
请在我的回答中查看编辑 1 和 2。
标签: java swing jtable tablecellrenderer