【问题标题】:How to get column width of Jtable after a user changes it用户更改后如何获取Jtable的列宽
【发布时间】:2019-10-14 04:32:24
【问题描述】:

我想知道在用户更改后如何获取列宽,以便我可以保存它。

在搞砸之后,我想出了这个方法,但它并不完美。如果用户实际上并没有通过单击列的一行来选择列,则所选列是-1,因此会引发错误,所以我使用 if 语句阻止了它。

下一个问题是,如果我选择一列然后更改宽度,它会在我更改列时工作并打印出宽度,但如果我选择说第 3 列,然后继续更改第 2 列宽度而不选择行在第 2 列中,当我更改第 2 列时,它将继续吐出第 3 列的宽度。所以它使用 select 方法按预期工作,但必须有更好的方法来获取我所在的列的宽度变化。

有什么想法吗?

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

        public void columnAdded(TableColumnModelEvent e) {
            // TODO Auto-generated method stub

        }

        public void columnRemoved(TableColumnModelEvent e) {
            // TODO Auto-generated method stub

        }

        public void columnMoved(TableColumnModelEvent e) {
            // TODO Auto-generated method stub

        }

        public void columnMarginChanged(ChangeEvent e) {
            int col = jt.getSelectedColumn();
            if (col >= 0) {
                TableColumn tc = jt.getColumnModel().getColumn(col);
                System.out.println(tc.getWidth());
            }
        }

        public void columnSelectionChanged(ListSelectionEvent e) {
            // TODO Auto-generated method stub

        }

    });

【问题讨论】:

  • ChangeEventsource 是什么?希望是实际的列发生了变化...
  • 是的,但我如何从源更改中获取其宽度?它不像我可以做 e.getwidth()。我还是个 java 新手,哈哈
  • 如果对象是列,您可以将传入的对象转换为列,然后调用通常对列进行的所有方法。
  • 这个问题可能是重复的。有空请看这个答案:stackoverflow.com/questions/8752694/…

标签: java jtable column-width


【解决方案1】:

您可以尝试将ChangeEvent 的源转换为TableColumn

如果有时间,请在您的 TableColumnModelListener 中尝试以下操作...

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

        public void columnAdded(TableColumnModelEvent e) {
            // TODO Auto-generated method stub
        }

        public void columnRemoved(TableColumnModelEvent e) {
            // TODO Auto-generated method stub
        }

        public void columnMoved(TableColumnModelEvent e) {
            // TODO Auto-generated method stub
        }

        public void columnMarginChanged(ChangeEvent e) {

            Object source = e.getSource();
            if (source instanceof TableColumn) {

                TableColumn tableColumn = (TableColumn) source;

                System.out.println(tableColumn.getWidth());
            }
        }

        public void columnSelectionChanged(ListSelectionEvent e) {
            // TODO Auto-generated method stub
        }
    });

【讨论】:

  • 这对我不起作用,这让我认为我的来源不是我所期望的。当我更改表格上的列宽时,select 方法正在工作,但是这段代码没有做任何事情。那么我如何知道我的来源是否是正在更改的列?
  • 打印出从ChangeEvent返回的对象。 System.out.println(e.getSource()); 看看对象是什么。希望这是相当明显的。
  • 所以这就是我得到的:javax.swing.table.DefaultTableColumnModel@322f59ba 它不起作用,因为它是默认表列模型的实例吗?我不确定此时我需要做什么,我尝试了其他一些没有运气的事情。我只是在这个时候还不够了解
【解决方案2】:

不久前我设法找到了解决方案,但忘记分享了。每次释放鼠标调整表头大小时,我都会存储所有列宽。

jt.getTableHeader().addMouseListener( new MouseAdapter() {
        
        public void mouseReleased(MouseEvent arg0){
            for(int i=0;i<jt.getColumnModel().getColumnCount();i++ ) {
                TableColumn column = jt.getColumnModel().getColumn(i);
                int tableColWidth = column.getWidth();
                String colHeader = (String) column.getHeaderValue();
                
                //Store the column Header with the column width
            }
        }
    });

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 2015-05-24
    • 2014-07-09
    • 1970-01-01
    • 2020-01-30
    • 2013-08-16
    • 2013-08-29
    • 2013-06-19
    • 2011-09-10
    相关资源
    最近更新 更多