2008-09-28 168 views
6

我正在嘗試使JTable具有列跨度可用。具體而言,我正在尋找在另一個JTable中嵌套JTable,並且當用戶單擊以查看嵌套表格時,它應該展開以便按下下面的行並填充空白空間。這與您在MS Access中可以嵌套表格的內容類似,單擊一行上的展開按鈕將顯示嵌套表格中的相應條目。JTable列跨越

如果有人知道使用JTable執行列間距的方法,請您指出正確的方向嗎?或者如果你知道另一種方法來做到這一點,我願意接受建議。該應用程序正在使用Swing構建。表中的元素,無論是高級別還是低級別,都必須在任何解決方案中都可編輯。使用嵌套JTable這不會是一個問題,任何其他解決方案也必須考慮到這一點。

回答

4

作爲正確方向的指針,請在SwingWiki上嘗試this article,它很好地解釋了列跨越的TableUI方法。在此之前,我還嘗試了一些替代方法,例如重寫TableCellRenderer繪畫方法,但沒有取得太大的成功。

+1

該鏈接不再工作:( – 2010-12-07 00:21:43

+2

如果文章仍然處於脫機狀態,請複製:http://web.archive.org/web/20080726035429/http://www.swingwiki.org/howto:column_spanning – Synox 2011-02-21 11:42:24

0

您需要爲主表編寫自己的TableUI。使用您自己的TableModel來保存其他數據(如行是否展開)也會很有幫助。但是這是可選的。

我編寫了一個擴展行並顯示文本編輯器的等效TableUI。在TableUI中,您需要使用table.setRowHeight(height)動態更改行。也有必要從BaseTableUI複製一些東西,因爲你不能訪問私人東西。

+1

我還沒有看到你將如何去告訴你的JTable在給定行合併列。我知道如何在表格中插入新行,但是如何告訴表格來合併這些單元格? – Elie 2008-09-28 19:40:33

0

基於代碼從代碼大師:

/* 
* (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

其他ressources: