我正在评估 Swingtools JTable,它是 JTable 和 JXTable 的开源且功能更强大的版本。正如维护者 Ivan Portyankin 在他的博客上解释的那样 ipsoftware blog :
"Sometimes it may seem that standard Swing JTable or its close companions like SwingX JXTable are too limited. You don’t have too many funny ways to manipulate them – they are strict rectangular grids, with every row taking fixed amount of screen space in pixels and columns taken from one and only column model. Columns cannot be spanned or split and always take a single cell in the grid."
现在我正在研究隐藏列的能力,这可以通过其界面来完成:不过,我想默认隐藏一些列,并在用户手动重新启用它们时存储首选项,以便始终显示最后选择的首选项。
下面我尝试将所有列隐藏为默认值,但出现 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 的列都会返回异常。
我在这里错过了什么吗?
最佳答案
The column count is 3, but getting anything greater than column 1 yields the error
int j = baseTable.getColumnCount(true);
for (int i = 0; i < j; i++)
是的,但是在隐藏第一列之后,只有 2 个。然后在隐藏下一列之后,只有一个(所以你会得到异常(exception))。
因此解决方案是隐藏表格末尾的列,而不是开头的列:
int j = baseTable.getColumnCount(true) -1;
for (int i = j; i >= 0; i--)
关于java - Swingtools扩展JXTable和JTable,隐藏列返回索引越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40488392/