オープンソースでJTableとJXTableのより強力なバージョンであるSwingtools JTableを評価しています。メンテナイワンPortyankinは、彼のブログipsoftware blog上でそれを説明しているように:。JTableとJTableのSwingtools拡張で、列を非表示にするとインデックスが範囲外に戻る
「時には標準のSwingのJTableやSwingX JXTableのようなその近く 仲間があまりにも限られていることをあなたがあまりにも 多くの面白い方法を持っていないように見えることがあり彼らは厳密な長方形の グリッドであり、すべての行はピクセル単位で一定量の画面領域をとります。 と列は1つの唯一の列モデルから取られます。
今、私は列を非表示の能力を調査しています、これは、そのインタフェースを介して行うことができます。のように、ユーザーが手動で再有効にした場合しかし、私は、デフォルトでいくつかの列を非表示にし、優先順位を保存したいのですがいつも最後に選んだ選好を表示してください。
以下、デフォルトですべての列を非表示にしていますが、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を超えるものは例外を返します。
ここに何か不足していますか?
はこれを試してみてください。代わりに 'baseTable.setModel(モデル)の;'、 '最終BASETABLE BASETABLEを行います=新しいBaseTable(モデル); '。必要に応じて行を並べ替えます。まだその問題がありますか? –
モデルをパラメータとして持つコンストラクタはなく、パラメータを持たないBaseTableのコンストラクタのみです。ソースコードを参照してください:https://github.com/thirdy/swingtools/blob/master/src/main/java/com/porty/swing/table/BaseTable.java –
私が提案した理由は、['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)))。 –