1

如果查询后没有结果,如何在 JTable 中显示居中文本或类似内容?谢谢你们。

4

3 回答 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 回答