Java JTable检测列由用户重新调整大小

Dea*_*ter 9 java swing jtable listener

我有一个JTable,它使用a TableColumnModelListener()来检测列何时重新调整大小,并且我有一些我想在该columnMarginChanged()方法中执行的代码.

如何确定列是由用户重新调整大小还是作为其他代码的结果?

我想我必须从头开始,ChangeEvent.getSource()但我不知道从那里去哪里.

谢谢.

ete*_*00b 7

我可以给你一个可能的方法.我试图解决同样的问题,因为我想将有关列宽的信息序列化到磁盘,以便下次在我的应用程序中打开表时,我可以适当地恢复列宽.开始:

第1步 - 覆盖JTable并为其添加布尔属性

class MyTable extends JTable {

    private boolean isColumnWidthChanged;
    public boolean getColumnWidthChanged() {
        return isColumnWidthChanged;
    }

    public void setColumnWidthChanged(boolean widthChanged) {
        isColumnWidthChanged = widthChanged;
    }

}
Run Code Online (Sandbox Code Playgroud)

第2步 - 向表中添加TableColumnModelListener()

private class TableColumnWidthListener implements TableColumnModelListener
{
    @Override
    public void columnMarginChanged(ChangeEvent e)
    {
        /* columnMarginChanged is called continuously as the column width is changed
           by dragging. Therefore, execute code below ONLY if we are not already
           aware of the column width having changed */
        if(!tableObj.hasColumnWidthChanged())
        {
            /* the condition  below will NOT be true if
               the column width is being changed by code. */
            if(tableObj.getTableHeader.getResizingColumn() != null)
            {
                // User must have dragged column and changed width
                tableObj.setColumnWidthChanged(true);
            }
        }
    }

    @Override
    public void columnMoved(TableColumnModelEvent e) { }

    @Override
    public void columnAdded(TableColumnModelEvent e) { }

    @Override
    public void columnRemoved(TableColumnModelEvent e) { }

    @Override
    public void columnSelectionChanged(ListSelectionEvent e) { }
}
Run Code Online (Sandbox Code Playgroud)

第3步 - 向表头添加鼠标侦听器

private class TableHeaderMouseListener extends MouseAdapter
{
    @Override
    public void mouseReleased(MouseEvent e)
    {
        /* On mouse release, check if column width has changed */
        if(tableObj.getColumnWidthChanged())
        {
            // Do whatever you need to do here

            // Reset the flag on the table.
            tableObj.setColumnWidthChanged(false);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:在我的应用程序中,TableHeaderMouseListener和TableColumnWidthListener类是我的主应用程序类的私有内部类.我的主要应用程序类保持对正在观察的表的引用.因此,这些内部类可以访问表实例.显然,根据您的设置,您需要执行适当的操作以使表实例可用于这些其他类.希望这可以帮助!