2016-11-08 22 views
1

オープンソースでJTableとJXTableのより強力なバージョンであるSwingtools JTableを評価しています。メンテナイワンPortyankinは、彼のブログipsoftware blog上でそれを説明しているように:。JTableとJTableのSwingtools拡張で、列を非表示にするとインデックスが範囲外に戻る

「時には標準のSwingのJTableやSwingX JXTableのようなその近く 仲間があまりにも限られていることをあなたがあまりにも 多くの面白い方法を持っていないように見えることがあり彼らは厳密な長方形の グリッドであり、すべての行はピクセル単位で一定量の画面領域をとります。 と列は1つの唯一の列モデルから取られます。

今、私は列を非表示の能力を調査しています、これは、そのインタフェースを介して行うことができます。swingtools tableのように、ユーザーが手動で再有効にした場合しかし、私は、デフォルトでいくつかの列を非表示にし、優先順位を保存したいのですがいつも最後に選んだ選好を表示してください。

以下、デフォルトですべての列を非表示にしていますが、ArrayIndexOutOfBoundsExceptionエラーが発生します。

public class AdvancedTableDemo extends JFrame 
{ 
    public AdvancedTableDemo() 
    { 
     super("Advanced Table Demo"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(600, 300); 

     final BaseTable baseTable = new BaseTable(); 
     baseTable.setFilterHeaderEnabled(true); 
     add(new JScrollPane(baseTable)); 
     BeanPropertyTableModel<TableBean> model = new BeanPropertyTableModel<TableBean>(TableBean.class); 
     model.setOrderedProperties(Arrays.asList("name", "surname", "date")); 
     model.setData(TableBean.generateList(100)); 
     baseTable.setModel(model); 

     int j = baseTable.getColumnCount(true); 
     for (int i = 0; i < j; i++) 
     { 
      TableColumnExt tableColumnExt = baseTable.getColumnExt(i); 
      tableColumnExt.setVisible(false); 
     } 
     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new AdvancedTableDemo(); 
      } 
     }); 
    } 
} 

エラーは次のとおりです。

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 1 
    at java.util.Vector.elementAt(Vector.java:474) 
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294) 
    at org.jdesktop.swingx.JXTable.getColumn(JXTable.java:2265) 
    at org.jdesktop.swingx.JXTable.getColumnExt(JXTable.java:2415) 
    at demo.table.AdvancedTableDemo.<init>(AdvancedTableDemo.java:46) 
    at demo.table.AdvancedTableDemo$1.run(AdvancedTableDemo.java:62) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

列数は3ですが、1列目よりも大きなものを得ることは、単に見て、エラーを生成します! 17列で試行し、10を超えるものは例外を返します。

ここに何か不足していますか?

+0

はこれを試してみてください。代わりに 'baseTable.setModel(モデル)の;'、 '最終BASETABLE BASETABLEを行います=新しいBaseTable(モデル); '。必要に応じて行を並べ替えます。まだその問題がありますか? –

+0

モデルをパラメータとして持つコンストラクタはなく、パラメータを持たないBaseTableのコンストラクタのみです。ソースコードを参照してください:https://github.com/thirdy/swingtools/blob/master/src/main/java/com/porty/swing/table/BaseTable.java –

+0

私が提案した理由は、['JTable .setModel() '](https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html#setModel(javax.swing.table.TableModel))ドキュメントでは、このテーブルのデータモデルをnewModelに設定し、新しいデータモデルからのリスナー通知用に登録します。 ([JTable(TableModel)]のコンストラクタ(https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html#)のように、列モデルを設定する方法はありませんJTable(javax.swing.table.TableModel)))。 –

答えて

1

列数は3ですが、1列目よりも大きなものを得ることがはい

int j = baseTable.getColumnCount(true); 
for (int i = 0; i < j; i++) 

エラーを得ていますが、非表示にした後、あなたが最初の列を非表示にした後にのみ2.次にあります次の列には1つしかありません(したがって例外が発生します)。

だから、解決策は、テーブルの端から列を非表示にすることではなく、初め:

int j = baseTable.getColumnCount(true) -1; 
for (int i = j; i >= 0; i--) 
+0

ありがとう、私はとてもばかげているが、実際にこれを理解できなかった!私はいくつかの睡眠が必要になります... –

関連する問題