質問
列スパンを使用できる JTable
を作成しようとしています。具体的には、 JTable
を別の JTable
内にネストすることを検討しており、ユーザーがネストしたテーブルを表示するためにクリックすると、展開して下の行を押し下げ、空きスペース。これは、テーブルをネストできるMS Accessに表示されるものと似ています。行の展開ボタンをクリックすると、ネストしたテーブルの対応するエントリが表示されます。
誰かが JTable
を使用して列のスパンを実行する方法を知っている場合、正しい方向に向けてください。または、これを行う別の方法を知っているなら、私は提案を受け入れます。アプリケーションはSwingで構築されています。テーブル内の要素(高レベルと低レベルの両方)は、どのソリューションでも編集可能でなければなりません。ネストされた JTable
を使用すると、これは問題になりません。他のソリューションでもこれを考慮する必要があります。
解決
正しい方向へのポインターとして、TableUIを説明するSwingWikiのこの記事を試してください。カラムスパンの方法は非常に良好です。これの前に、TableCellRendererペイントメソッドをオーバーライドするなど、いくつかの代替手段も試しましたが、あまり成功していませんでした。
他のヒント
マスターテーブル用に独自のTableUIを作成する必要があります。また、独自のTableModelを使用して、行が展開されている場合などの追加データを保存すると便利です。ただし、これはオプションです。
行を展開してテキストエディタを表示するequals 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年以降は利用不可。現在はウェブアーカイブ)
その他のリソース: