JTable列跨度

6
我正在尝试制作一个具有列跨度的JTable。具体来说,我想将一个JTable嵌套在另一个JTable中,当用户点击查看嵌套表时,它应该展开以向下推动下面的行并填充空白空间。这类似于在MS Access中看到的嵌套表,单击行上的展开按钮将向您显示嵌套表中对应的条目。
如果有人知道如何使用JTable执行列跨度,请指点一下。或者如果您知道其他方法来实现此目的,我也愿意听取建议。该应用程序是使用Swing构建的。表中的元素,包括高级和低级别,都必须可编辑。使用嵌套的JTable解决这个问题不会有问题,任何其他解决方案也必须考虑到这一点。
3个回答

4
作为指向正确方向的指针,可以尝试查看 SwingWiki 上的此篇文章,其中详细解释了列合并的 TableUI 方法。在此之前,我也尝试了一些替代方法,例如重写 TableCellRenderer 的 paint 方法,但并没有取得太大成功。

2
如果文章仍然离线,请复制:http://web.archive.org/web/20080726035429/http://www.swingwiki.org/howto:column_spanning - Synox

0

基于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年以来不可用,现在请参见Web Archive

其他资源:


1
Code-Guru说“页面未找到”。这正是为什么不鼓励只提供链接的答案。 - Matthieu

0
你需要为主表编写自己的TableUI。使用自己的TableModel保存额外数据,例如行是否展开,也会很有帮助。但这是可选的。
我编写了一个相等的TableUI,可以展开一行并显示文本编辑器。在TableUI中,你需要使用table.setRowHeight(height)动态更改行高。此外,由于无法访问私有内容,因此需要从BaseTableUI复制一些内容。

1
我仍然不知道您将如何告诉您的JTable在给定行中合并列。我知道如何向表格中插入新行,但是如何告诉表格合并这些单元格呢? - Elie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接