我正在尝试制作一个可以使用列跨度的JTable
。具体来说,我希望将JTable
嵌套在另一个JTable
中,当用户单击以查看嵌套表时,它应该展开以按下下面的行并填充空白区域。这与您在MS Access中可以嵌套表格的内容类似,单击行上的展开按钮将显示嵌套表格中的相应条目。
如果有人知道使用JTable
执行列间距的方法,请指点我指向正确的方向吗?或者如果您知道另一种方法,我愿意接受建议。该应用程序正在使用Swing构建。表中的元素,无论是高级还是低级,都必须在任何解决方案中都可编辑。使用嵌套的JTable
这不会是一个问题,任何其他解决方案也必须考虑到这一点。
答案 0 :(得分:4)
作为指向正确方向的指针,请在SwingWiki上尝试this article,它可以很好地解释列的TableUI方法。在此之前,我还尝试了一些替代方法,例如重写TableCellRenderer绘制方法,但没有取得多大成功。
答案 1 :(得分:0)
您需要为主表编写自己的TableUI。使用您自己的TableModel来保存其他数据(如扩展行)也很有帮助。但这是可选的。
我写了一个等于TableUI,展开一行并显示文本编辑器。在TableUI中,您需要使用table.setRowHeight(height)动态更改行高。此外,有必要从BaseTableUI复制一些东西,因为你无法访问私有东西。
答案 2 :(得分: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)
其他资源: