我有一个带行滤波器的JTable。
如果我没有获得任何行,那么我必须在第一行的表格中显示一个字符串,例如“Nothing found to display”。
请做好。
谢谢, 纳拉辛哈
答案 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张卡片 - 一张包含表格,另一张包含空数据警告。如果过滤器返回空结果,则显示卡片为空警告,在其他情况下 - 显示表格。