我不明白Nimbus中的替代行着色是如何工作的。看起来真的很疯狂!我想在这里澄清一切。
对于演示,让我们说我们想要一个交替红色和粉红色行的JTable (我不关心哪个颜色是第一个)。
没有重新定义执行自己的“模2”的自定义cellRenderers ,并且没有覆盖JTable中的任何方法,我想列出启动一个应用程序和获取带有自定义备用的JTable之间的必要步骤行颜色仅使用Nimbus属性。
以下是我希望遵循的步骤:
这里是源代码:
public class JTableAlternateRowColors implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new JTableAlternateRowColors());
}
@Override
public void run() {
try {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
UIManager.getDefaults().put("Table.background", Color.RED);
UIManager.getDefaults().put("Table.alternateRowColor", Color.PINK);
final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
jFrame.getContentPane().add(new JScrollPane(new JTable(new String[][] {
{"one","two","three"},
{"one","two","three"},
{"one","two","three"}
}, new String[]{"col1", "col2", "col3"}
)));
jFrame.setSize(400, 300);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
这是JDK6代码。 有人可以告诉我这里出错吗?
根据@ kleopatra的评论以及整个社区的贡献,这是使用Nimbus属性获得备用行着色的方法
公共类JTableAlternateRowColors实现Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new JTableAlternateRowColors());
}
@Override
public void run() {
try {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
UIManager.put("Table.background", new ColorUIResource(Color.RED));
UIManager.put("Table.alternateRowColor", Color.PINK);
UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", new ColorUIResource(Color.RED));
final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
final JTable jTable = new JTable(new String[][]{
{"one", "two", "three"},
{"one", "two", "three"},
{"one", "two", "three"}
}, new String[]{"col1", "col2", "col3"});
jTable.setFillsViewportHeight(true);
jFrame.getContentPane().add(new JScrollPane(jTable));
jFrame.setSize(400, 300);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
答案 0 :(得分:10)
看起来像几个错误的干扰......
要更改默认表格背景和默认条带化,UIManager的预期(不仅是你的,我的)配置(对于所有尊重alternateRow属性的LAF也是如此)将是:
UIManager.put("Table.background", Color.RED);
UIManager.put("Table.alternateRowColor", Color.PINK);
对Metal和Nimbus都不起作用
第一个的基本原因可以在DefaultTableCellRenderer中找到:
Color background = unselectedBackground != null
? unselectedBackground
: table.getBackground();
if (background == null || background instanceof javax.swing.plaf.UIResource) {
Color alternateColor = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
if (alternateColor != null && row % 2 != 0) {
background = alternateColor;
}
}
它的逻辑是弯曲的:仅当表的背景是colorUIResource时才采用替代颜色,这是一个相当弱的区别。无论如何,它引导我们下一次尝试:
UIManager.put("Table.background", new ColorUIResource(Color.RED));
UIManager.put("Table.alternateRowColor", Color.PINK);
这看起来很好(除了复选框渲染器的典型问题,但这是另一个错误的故事;-)对于金属,仍然没有运气Nimbus。
下一步是查找可能相关的Nimbus defaults,然后申请(在设置LAF之后):
UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background",
new ColorUIResource(Color.RED));
修改(正如评论中提到的那样)
JXTable试图完全解决问题 - 它的条带化手段是从HighlighterFactory中检索到的荧光笔。需要通过从lookAndFeelDefaults中删除alternateRowColor属性并使用新键“UIColorHighlighter.stripingBackground”添加它来弄脏Nimbus
答案 1 :(得分:3)
使用Nimbus属性(+1到@Kleopatra证明我错了:()你可以设置交替的行颜色
UIManager.put("Table.alternateRowColor", Color.PINK);
UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", Color.RED);
或者通过:
扩展JTable
并覆盖prepareRenderer(TableCellRenderer renderer, int row, int column)
,以便为单元格绘制所需的颜色( RED 和 PINK )。
这是一个我希望它有帮助的简短例子。
额外功能
它还会覆盖paintComponent(..)
,它会调用paintEmptyRows(Graphics g)
,它会为JScrollPane
视口的整个高度和宽度绘制行,但这仅适用于setFillsViewPortHeight
设置为{{1}的情况在true
:
MyTable
<强>参考文献:强>