如果查询后没有结果,如何在 JTable 中显示居中文本或类似内容?谢谢你们。
问问题
1281 次
3 回答
2
我不会在 JTable 中显示标签,而是在JTable中显示标签。
尝试从其容器中删除表格元素,并添加带有消息的 Jlabel。
当用户运行另一个查询,结果为正时,执行相反的方式(删除标签,添加表格)
于 2011-02-09T17:41:58.000 回答
1
只需像通常那样将文本添加到模型中,然后创建自定义渲染器。就像是:
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );
或者,如果您希望所有包含字符串数据的列居中,那么您可以使用
table.getDefaultRenderer(class.String);
然后重置该渲染器的对齐方式。
编辑:我误读了这个问题。
如果您只想在表格中显示一条消息,则可以将表格的 TableModel 更改为仅显示带有单行的单列表格和错误消息。此列仍需要使用自定义渲染器。
要重置模型,您只需执行以下操作:
DefaultTableModel model = new DefaultTableModel(...);
table.setModel( model );
当然,如果查询成功,您还必须使用新数据重置模型。
于 2011-02-09T17:45:19.340 回答
1
另一种选择:如果没有行,则真正在表格中绘制一些 - 适当定位的 - 文本而不是行。为了实现这一点
- 子类 J/X/Table 并覆盖paintComponent
确保表格扩展到视口大小(即 trackViewportHeight 为 true,这是 JXTable 的默认设置,必须为 JTable 显式设置)
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (getRowCount() > 0) return; Component comp = getNoDataRenderer(); CellRendererPane rendererPane = getRendererPane(); Dimension size = getSize(); Dimension prefSize = comp.getPreferredSize(); Rectangle rect = new Rectangle((size.width - prefSize.width) / 2, size.height / 4, prefSize.width, prefSize.height); rendererPane.paintComponent(g, comp, this, rect); } private Component getNoDataRenderer() { if (noDataRenderer == null) { noDataRenderer = createNoDataRenderer(); } String localizedNoData = UIManager.getString("noData"); Component comp = noDataRenderer.getTableCellRendererComponent(this, localizedNoData != null ? localizedNoData : "No Data Available", false, false, -1, -1); Font bigger = getFont().deriveFont(Font.BOLD | Font.ITALIC, getFont().getSize2D() * 2); comp.setFont(bigger); return comp; } private DefaultTableCellRenderer createNoDataRenderer() { DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setForeground(Color.GRAY); return renderer; } private CellRendererPane getRendererPane() { for (int i = 0; i < getComponentCount(); i++) { if (getComponent(i) instanceof CellRendererPane) { return (CellRendererPane) getComponent(i); } } return null; }
与其他建议相比的优势(可以说,这些当然是我的 2 美分 :):
- 切换组件(标签与表格):一种可能会让用户感到困惑的不连续视觉效果。一张空桌子仍然是一张桌子。
- 特殊的空模型:解决数据领域中的视图问题是......次优的。另外需要特别注意不要松动真实模型的列状态
于 2011-09-11T12:10:36.903 回答