JTable列跨越

我正在尝试制作一个可用列跨度的JTable 。 具体来说,我希望将JTable嵌套在另一个JTable ,当用户单击以查看嵌套表时,它应该展开以按下下面的行并填充空白区域。 这与您在MS Access中可以嵌套表格的内容类似,单击行上的展开按钮将显示嵌套表格中的相应条目。

如果有人知道使用JTable执行列跨度的方法,请指点我正确的方向? 或者,如果您知道另一种方法,我愿意接受建议。 该应用程序正在使用Swing构建。 表中的元素,无论是高级还是低级,都必须在任何解决方案中都可编辑。 使用嵌套的JTable这不会是一个问题,任何其他解决方案也必须考虑到这一点。

作为正确方向的指针,请在SwingWiki上尝试这篇文章 ,它解释了列的跨越的TableUI方法。 在此之前,我还尝试了一些替代方法,例如重写TableCellRenderer绘制方法,但没有取得多大成功。

您需要为主表编写自己的TableUI。 使用您自己的TableModel来保存其他数据(如扩展行)也很有帮助。 但这是可选的。

我写了一个等于TableUI,展开一行并显示文本编辑器。 在TableUI中,您需要使用table.setRowHeight(height)动态更改行高。 此外,有必要从BaseTableUI复制一些东西,因为你无法访问私有东西。

基于Code-Guru的代码:

 /* * (swing1.1beta3) * * |-----------------------------------------------------| * | 1st | 2nd | 3rd | * |-----------------------------------------------------| * | | | | | | | */ //package jp.gr.java_conf.tame.swing.examples; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import jp.gr.java_conf.tame.swing.table.*; /** * @version 1.0 11/09/98 */ public class MultiWidthHeaderExample extends JFrame { MultiWidthHeaderExample() { super( "Multi-Width Header Example" ); DefaultTableModel dm = new DefaultTableModel(); dm.setDataVector(new Object[][]{ {"a","b","c","d","e","f"}, {"A","B","C","D","E","F"}}, new Object[]{"1 st","","","","",""}); JTable table = new JTable( dm ) { protected JTableHeader createDefaultTableHeader() { return new GroupableTableHeader(columnModel); } }; TableColumnModel cm = table.getColumnModel(); ColumnGroup g_2nd = new ColumnGroup("2 nd"); g_2nd.add(cm.getColumn(1)); g_2nd.add(cm.getColumn(2)); ColumnGroup g_3rd = new ColumnGroup("3 rd"); g_3rd.add(cm.getColumn(3)); g_3rd.add(cm.getColumn(4)); g_3rd.add(cm.getColumn(5)); GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader(); header.addColumnGroup(g_2nd); header.addColumnGroup(g_3rd); JScrollPane scroll = new JScrollPane( table ); getContentPane().add( scroll ); setSize( 400, 100 ); header.revalidate(); } public static void main(String[] args) { MultiWidthHeaderExample frame = new MultiWidthHeaderExample(); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit(0); } }); frame.setVisible(true); } } 

资料来源: http : //www.codeguru.com/java/articles/125.shtml (自2012年起无法使用,现在请参阅网络存档 )

其他资源:

  • Java-6更新源: http : //qoofast.blog76.fc2.com/blog-entry-2.html (已翻译)
    • ColumnGroup.java
    • GroupableTableHeader.java
    • GroupableTableHeaderUI