java - Swingtools扩展JXTable和JTable,隐藏列返回索引越界

标签 java swing jtable

我正在评估 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."

现在我正在研究隐藏列的能力,这可以通过其界面来完成: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 的列都会返回异常。

我在这里错过了什么吗?

最佳答案

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/

相关文章:

java - 如何根据搜索值从jtable和sql数据库中删除搜索行

java - 单独运行Jar文件

java - 对可调用执行器进行单元测试

java - 方法作用域仅在另一个方法内

java - 如何使用 Elastic 的高级 Rest 客户端获取所有索引?

java - 使用 NetBeans 在 SQL 数据库中将日期保存为 dd/MM/yyyy

java - 如何使 JTable 单元格在单击时执行与双击时不同的操作?

Java - ResultSet 更改数据库列名称以在 JTable 中显示

java - 如何处理JTable数据改变事件

java - 无法识别Java 1.7的夏令时更改