2009-06-11 15 views
4

フッター行をJTableに挿入する最適な方法は何ですか?誰もこれを行うためのサンプルコードがありますか?JTableのフッター行

これまで私が考えてきた唯一のアプローチは、テーブルモデルに特別な行を入れて、常に下部にソートすることです。ここで


は私がなってしまったものです:

JTable mainTable = new JTable(mainTableModel); 
JTable footerTable = new JTable(footerModel); 
footerTable.setColumnModel(mainTable.getColumnModel()); 

// Disable selection in the footer. Otherwise you can select the footer row 
// along with a row in the table and that can look quite strange. 
footerTable.setRowSelectionAllowed(false); 
footerTable.setColumnSelectionAllowed(false); 

JPanel tablePanel = new JPanel(); 
BoxLayout boxLayout = new BoxLayout(tablePanel, BoxLayout.Y_AXIS); 
tablePanel.setLayout(boxLayout); 
tablePanel.add(mainTable.getTableHeader()); // This seems like a bit of a WTF 
tablePanel.add(mainTable); 
tablePanel.add(footerTable); 

ソートが正常に動作しますが、フッター行を選択すると、少し奇妙です。

答えて

5

データテーブルと同じ列モデルを使用する2番目のJTableを使用して、そのテーブルにフッターデータを追加してみてください。元のテーブルの下に2番目の(フッター)テーブルを追加します。

JTable footer = new JTable(model, table.getColumnModel()); 
panel.add(BorderLayout.CENTER, table); 
panel.add(BorderLayout.SOUTH, footer); 
+3

これは基本的には良い解決策のように見えますが、列のサイズを変更しようとすると非常に異常に反応するようです。 – Stroboskop

+0

この投稿は2つのテーブルを同期させるのに役立ちます http://stackoverflow.com/questions/2666758/problem-with-resizing-columns-in-a-double-jtable –

+0

JideScrollPaneははるかに優れた働きをし、テーブルが起動するイベントを同期させます。下の私の答えを見てください。 – Umi

0

私はちょうどそうのようなモデル内の行を追加、私はこれを行っている唯一の時間:

@Override 
    public int getRowCount() { 
     return _tableContents.size() + 1; 
    } 

_tableContentsはもちろん、私のモデルの背後にある実際のデータです。モデルの余分な行を(setValueAt(...)のような呼び出しで)認識しなければなりません。

幸いです。

+2

このアプローチの唯一の問題はソートです。私はテーブルの一番下にとどまるためにフッタ行が必要です。 –

0

TableCellRendererを実装して、最後に表示された行のレンダリングされたコンテンツをフッターに置き換えることができます。しかし、これはテーブルの一番下に固定されません。スクロールすると上下に移動する可能性があります。

0

私は最善のアプローチを推測(確かにない最も簡単には)、JTableHeaderコンポーネントのソースコードを見てみましょう、それがどのように動作するか確認してから、独自のJTableFooterコンポーネントを作成することです。 JTableHeader UIデリゲートをフッターに再利用することができますが、主な違いはgetHeaderRect()メソッドにあり、指定された列ヘッダータイルの境界が決定されると思います。ここで

0

は私のために機能するソリューションは、(あなたのJTableはJScrollPaneの内部でなければなりません)ビューポートの境界線を描くさjava bug database

で述べた別のソリューションです....

1

それぞれの下に2つのテーブルを使用することは良いアプローチです。

カラムをサイズ変更/移動/削除できるようにする場合、キーは同じカラムモデルをテーブル間で再利用しないことです。リスナーにサイズ変更を依頼してください。例を参照してください:このprojectが行フッターのサポートをアドバタイズJideScrollPaneと呼ばれるコンポーネントを持っているよう

package snippet; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.TableColumnModelEvent; 
import javax.swing.event.TableColumnModelListener; 
import javax.swing.table.TableColumnModel; 

public class FixedRow2Tables extends JFrame { 
    private static final long serialVersionUID = 4676303089799270571L; 
    Object[][] data; 
    Object[] column; 
    JTable footerTable, table; 

    public FixedRow2Tables() { 
     super("Fixed Row Example"); 

     Object[][] mainData = new Object[][] { { "a", "", "", "", "", "" }, 
       { "", "b", "", "", "", "" }, { "", "", "c", "", "", "" }, 
       { "", "", "", "d", "", "" }, { "", "", "", "", "e", "" }, 
       { "", "", "", "", "", "f" } }; 
     Object[][] summaryData = { { "fixed1", "", "", "", "", "" }, 
       { "fixed2", "", "", "", "", "" } }; 
     column = new Object[] { "A", "B", "C", "D", "E", "F" }; 

     table = new JTable(mainData, column); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

     footerTable = new JTable(summaryData, column); 
     footerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     footerTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     footerTable.setTableHeader(null); 
     // footerTable.setColumnModel(table.getColumnModel()); 

     table.getColumnModel().addColumnModelListener(
       new TableColumnModelListener() { 

        @Override 
        public void columnSelectionChanged(ListSelectionEvent e) { 
        } 

        @Override 
        public void columnRemoved(TableColumnModelEvent e) { 
        } 

        @Override 
        public void columnMoved(TableColumnModelEvent e) { 
        } 

        @Override 
        public void columnMarginChanged(ChangeEvent e) { 
         final TableColumnModel tableColumnModel = table 
           .getColumnModel(); 
         TableColumnModel footerColumnModel = footerTable 
           .getColumnModel(); 
         for (int i = 0; i < tableColumnModel.getColumnCount(); i++) { 
          int w = tableColumnModel.getColumn(i).getWidth(); 
          footerColumnModel.getColumn(i).setMinWidth(w); 
          footerColumnModel.getColumn(i).setMaxWidth(w); 
          // footerColumnModel.getColumn(i).setPreferredWidth(w); 
         } 
         footerTable.doLayout(); 
         footerTable.repaint(); 
         repaint(); 
        } 

        @Override 
        public void columnAdded(TableColumnModelEvent e) { 
        } 
       }); 

     JScrollPane scroll = new JScrollPane(table); 
     scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     scroll.setPreferredSize(new Dimension(400, 100)); 
     getContentPane().add(scroll, BorderLayout.CENTER); 
     getContentPane().add(footerTable, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       FixedRow2Tables frame = new FixedRow2Tables(); 
       frame.addWindowListener(new WindowAdapter() { 
        @Override 
        public void windowClosing(WindowEvent e) { 
         System.exit(0); 
        } 
       }); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

+1なし 'table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);' – mKorbel

2

が見えます。私は自分でそれを試していないが、それはあなたが望むものを正確に行うように聞こえる! ウェブサイトにもデモアプリケーションがあり、実際に見られ、かなり見えるようになっています。

あなたが支払う必要があるものはたくさんあるようですが、JideScrollPaneは無料でオープンソースに見えます。

0
import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 

class Application extends JFrame 
{ 
    public Application() 
    { 
     this.setBounds(100,100,500,200); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     String data[][] = {{"a1","b1","c1"},{"a2","b2","c2"},{"a3","b3","c3"}}; 
     String columnNames[] = {"a","b","c"}; 

     JTable jtable = new JTable(new DefaultTableModel(data,columnNames)); 

     JScrollPane jscrollPane = new JScrollPane(jtable,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     jscrollPane.setBorder(new CompoundBorder(new MatteBorder(0,0,1,0,Color.gray),new EmptyBorder(0,0,0,0))); 

     this.add(jscrollPane,BorderLayout.CENTER); 


     JTable jtable_footer = new JTable(new DefaultTableModel(3,columnNames.length),jtable.getColumnModel()); 

     SyncListener syncListener = new SyncListener(jtable,jtable_footer); 

     this.add(jtable_footer,BorderLayout.SOUTH); 
    } 

    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       Application application = new Application(); 

       application.setVisible(true); 
      } 
     }); 
    } 
} 

class SyncListener implements TableColumnModelListener 
{ 
    JTable jtable_data; 
    JTable jtable_footer; 

    public SyncListener(JTable main, JTable footer) 
    { 
     jtable_data = main; 
     jtable_footer = footer; 

     DefaultTableColumnModel dtcm = (DefaultTableColumnModel)jtable_data.getColumnModel(); 

     dtcm.removeColumnModelListener(dtcm.getColumnModelListeners()[1]); 
     dtcm.addColumnModelListener(this); 
    } 

    public void columnMarginChanged(ChangeEvent changeEvent) 
    { 
     for (int column = 0; column < jtable_data.getColumnCount(); column++) 
     { 
      jtable_footer.getColumnModel().getColumn(column).setWidth(jtable_data.getColumnModel().getColumn(column).getWidth()); 
     } 

     jtable_footer.repaint(); 
    } 

    public void columnAdded(TableColumnModelEvent e){} 
    public void columnMoved(TableColumnModelEvent e){} 
    public void columnRemoved(TableColumnModelEvent e){} 
    public void columnSelectionChanged(ListSelectionEvent e){} 
}