如果在过滤时未找到条目,则在JTable行内显示“未找到行”

时间:2010-06-21 17:32:57

标签: swing

我有一个带行滤波器的JTable。

如果我没有获得任何行,那么我必须在第一行的表格中显示一个字符串,例如“Nothing found to display”。

请做好。

谢谢, 纳拉辛哈

3 个答案:

答案 0 :(得分:9)

我今天需要解决这个问题,并且无法在网上找到一个好的答案。最后我提出了自己的解决方案,我认为这可能正是你想要的。我不知道这对你的项目来说是否为时已晚,但也许它可以帮助其他人:

除非表的高度大于0,否则不会调用

JTable.paintComponent(Graphics g)。这会导致空表出现问题,因此如果需要,我们会扩展JTable高度,以便它始终为至少是它的父母JViewport的大小。

JTable tableName =  new JTable() {
  public boolean getScrollableTracksViewportHeight() {
    if(getParent() instanceof JViewport)
      return(((JViewport)getParent()).getHeight() > getPreferredSize().height);

    return super.getScrollableTracksViewportHeight();
  }

  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(getRowCount() == 0) {
      Graphics2D g2d = (Graphics2D) g;
      g2d.setColor(Color.BLACK);
      g2d.drawString("Nothing found to display.",10,20);
    }
  }
}

containerName.add(new JScrollPane(tableName));

答案 1 :(得分:0)

如果过滤器排除了所有行,则getViewRowCount()返回的结果将为零。您可以相应地更新GUI;如果缺少屏幕空间,setToolTipText()会很方便。

以下是一个例子:

TableModel model = ...
JTable table = new JTable(model);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
JScrollPane pane = new JScrollPane(table);
JLabel label = new JLabel("");
...
String s = "Rows: " + sorter.getViewRowCount()
pane.setToolTipText(s);
label.setText(s);

答案 2 :(得分:0)

要在多列表中显示一行文字可能非常困难,不支持span AFAIK。 一种可能性是隐藏所有数据列(稍后显示它们必须在某处记住它们)并显示消息的一列。

更简单的方法是使用CardLayout创建JPanel,添加2张卡片 - 一张包含表格,另一张包含空数据警告。如果过滤器返回空结果,则显示卡片为空警告,在其他情况下 - 显示表格。