用户更改后如何获取Jtable的列宽

How to get column width of Jtable after a user changes it

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

经过一番折腾,我想到了这个方法,但并不完美。如果用户实际上没有通过单击列的一行 select 列,则 selected 列为 -1 从而引发错误,因此我使用 if 语句阻止了该错误。

下一个问题是,如果我 select 一列然后更改宽度,它可以工作并在我更改列时打印出宽度,但是如果我 select 说第 3 列但是然后继续更改第 2 列的宽度,而第 2 列的行中没有 selecting,当我更改第 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

        }

    });

您可以尝试将 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
        }
    });

我前段时间找到了解决办法,但忘了分享。每次在 table header.

上释放鼠标时,我都会存储所有列宽
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
            }
        }
    });