更改Swing JTable单元格颜色
我正在尝试使用JTables,TableModels,JTableHeaders,渲染器等。我正在尝试制作一个简单的虚拟表(用于练习目的),如下所示:
- 1 2 3 A A1 A2 A3 B B1 B2 B3 C C1 C2 C3
我还希望B2单元格 – 只有那个单元格 – 具有蓝色(Color.BLUE)背景 – 所有其他单元格都可以具有自动分配的Swing默认颜色。
我的代码如下,基于我在本网站和互联网上发现的无数例子。 但我没有得到我想要的结果。 相反,我得到一个看起来像这样的表:
A A1 A2 A3 B B1 B2 B3 C C1 C2 C3
请注意,第一行(标题)根本不存在。 此外,使用下面列出的代码,这将执行并设置所有颜色的单元格的颜色,而不仅仅是我想要的B2单元格。
代码 :
public class MyTable { public static void main(String[] args) { String[][] data = getTableData(); String[] cols = getTableCols(); JFrame frame = magicallyCreateJFrame(); // I promise this works! MyRenderer myRenderer = new MyRenderer(); // See below DefaultTableModel defModel = new DefaultTableModel(data, cols); JTable myTable = new JTable(defModel); myTable.setDefaultRenderer(Object.class, myRenderer); frame.add(myTable); frame.pack(); frame.setVisible(true); } } public static String[] getTableCols() { String cols = { "-", "1", "2", "3", }; } public static String[][] getTableData() { String[][] data = { { "A", "A1", "A2", "A3", }, { "B", "B1", "B2", "B3", }, { "C", "C1", "C2", "C3", }, }; return data; }
快速肮脏的MyRenderer
类:
public class MyRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if(row == 2 && column == 2) c.setBackground(new java.awt.Color(0, 0, 255)); return c; } }
除了这是一个可怕的代码,打破了很多“最佳实践”类型的模式和技术(记住这只是我正在玩的东西), 有什么我在这里做的明显是明显的吗? 为什么我没有得到表头(第一行“ – 1 2 3”)? 为什么我的默认单元格渲染器不能处理我指定的特定B2单元格?
JTable似乎是奇怪,美丽和强大的野兽。 我正在慢慢地把我的思绪包裹在他们周围,但是我对实施感到窒息。 感谢任何可以帮助!
您需要确保将渲染器重置为其默认背景颜色(并处理行选择):
if (! table.isRowSelected(row)) { if(row == 2 && column == 2) c.setBackground(new java.awt.Color(0, 0, 255)); else c.setBackground(table.getBackground()); }
在将来发布一个适合您的问题的SSCCE 。
半答案:
您需要将JTable
放在JScrollPane
以显示标题。 或者,您也可以手动将myTable.getTableHeader()
返回的组件添加到布局中。 我建议使用JScrollPane
。
编辑:
如下所示,要将背景蓝色仅转换为一个特定单元格,您需要做的就是添加如下测试:
if(column == 2 && row == 1) { c.setBackground(Color.BLUE); } else { c.setBackground(Color.WHITE); }
你在哪里指定渲染器颜色B2和只B2? 您可能希望在getTableCellRendererComponent方法中放置一个if块,以便仅当JTable的值对象的toString()为“B2”或者行和列值对应于B2单元格时才将背景颜色设置为蓝色。
要查看表头,首先应将表添加到JScrollPane,然后将JScrollPane添加到父表。
最重要的是:阅读有关JTables的Swing教程,因为这里都有解释。
也许, myTable.setDefaultRenderer(String.class, myRenderer);
会工作正确。
我相信表着色的正确方法是通过ColorHighlighter
。 我在这里举了一个例子 。
- 基于没有单例的HttpRequest的jersey 2上下文注入
- Java字符串操作 – 添加空格或子字符串
- 使用Maven插件测试中的org.apache.maven.repository.RepositorySystem进行组件查找exception
- 在不冻结UI线程的情况下实现游戏循环的最佳方法
- 找到多个注释匹配的通配符是严格的,但是没有找到元素’ehcache:annotation-driven的声明
- IBM Worklight 6.1 – “Ecma错误:TypeError:无法在对象中调用属性”
- 用Java重写C代码以构造完整的二叉树
- HQL – 分页的行标识符
- 如何正确地将JSP放在WEB-INF文件夹中?