如何在JTable中隐藏(使不可见)行?

问题描述:

有什么办法可以做到吗?如何在JTable中隐藏(使不可见)行?

best最简单的方法是从模型中删除相应的元素。

+0

但如果我需要显示他以后再来? – joycollector 2009-06-03 10:25:06

+0

然后你再次添加它:) – willcodejavaforfood 2009-06-03 10:27:50

+0

最后我这样做了...两个dataSets ...一个已满,另一个填充fireDataTableChanged时调用...但我恐怕它很慢... – joycollector 2009-06-04 05:02:23

检出Sun's Tutorial for JTables并查看“排序和筛选”部分。

RowFilter<DefaultTableModel, Object>类可以用来过滤行。 DefaultTableModel可以用你自己的模型替换。为了过滤,实现方法

@Override 
public boolean include(Entry entry) { 
    // All rows are included if no filter is set 
    if (filterText.isEmpty()) 
     return true; 

    // If any of the column values contains the filter text, 
    // the row can be shown 
    for (int i = 0; i < entry.getValueCount(); i++) { 
     String value = entry.getStringValue(i); 
     if (value.toLowerCase().indexOf(filterText) != -1) 
      return true; 
    } 

    return false; 
} 

当访问行,例如听ListSelectionEvents,不要忘了在模型中可见行索引完整行索引翻译。 Java进行这提供了一个功能,以及:

public void valueChanged(ListSelectionEvent e) { 
    ListSelectionModel lsm = (ListSelectionModel) e.getSource(); 

    int visibleRowIndex = ... // Get the index of the selected row 

    // Convert from the selection index based on the visible items to the 
    // internal index for all elements. 
    int internalRowIndex = tableTexts 
      .convertRowIndexToModel(visibleRowIndex); 

    ... 
} 

你可以成立一个由过滤的值填充,并在自定义渲染实现这些每一列的ArrayList。如果不符合单元格的所有行值,则渲染器将以row + 1递归调用自身。

如果细胞排不符合标准,它就会被渲染,另一个ArrayList中存储的行数已经呈现,其最好的例子来说明这种方法是在客户呈现扩展JLabel

public Component getTableCellRendererComponent(JTable table, Object color, 
     boolean isSelected, boolean hasFocus, int row, int column) { 

    Object value; 
    String s; 

    try { 
     if (row == 0) { 
      drawn[column].clear(); 
     }// drawn is arraylist which stores cols rend 
     if (row > table.getModel().getDataVector.size()) { 
      return null; 
     }// if we go too far 
     if (drawn[column].contains(Integer.toString(row)) == true) { 
      // already rendered? 
      return getTableCellRendererComponent(table, color, isSelected, 
        hasFocus, (row + 1), column); 
     }// render row+1 

     for (int i = 0; i < filters.length; i++) { 
      value = table.getModel().getValueAt(row, i); 
      s = (i == 1) ? df.format(value) : value.toString(); 
      if (filters[i].contains(s) != true) { 
       //try and put in next row, if succeeds when it reaches column 8 it adds row to 
       return getTableCellRendererComponent(table, color, 
         isSelected, hasFocus, (row + 1), column); 
      } 
     } 

     value = table.getModel().getValueAt(row, column); 

     setFont(getFont().deriveFont(Font.BOLD)); 

     if ((isSelected == false)) { 

      if ((column == 1)) { 
       setForeground(Color.magenta); 
      }// just formatting 
      else { 
       setForeground(Color.black); 
       setBackground(Color.white); 
      } 

     } else { 
      setBackground(Color.blue); 
      setForeground(Color.white); 
     } 

     if ((column == 1))// col 1 is a date, other columns strings 
     { 
      setText((value == null) ? "" : df.format(value)); 
     } else { 
      setText((value == null) ? "" : value.toString()); 
     } 

     todayStr = df.format(new java.util.Date()); 
     dateval = table.getModel().getValueAt(row, 1); 
     String datevalStr = df.format(dateval); 
     if (datevalStr.equals(todayStr)) { 
      setForeground(Color.red); 
     } 
     drawn[column].add(Integer.toString(row));// mark row as rendered 

    } catch (Exception e) { 
     e.getMessage(); 
     return null; 
    } 
    return this; 
}