当前位置: 首页 > 面试题库 >

Java JTable检测按用户调整大小的列

谷梁波
2023-03-14
问题内容

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

如何确定该列是由用户调整大小还是由于其他代码导致?

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

谢谢。


问题答案:

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

第1步-覆盖您的JTable并向其中添加一个布尔属性

class MyTable extends JTable {

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

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

}

第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) { }
}

步骤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);
        }
    }
}

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



 类似资料:
  • 问题内容: 我使用Qt Designer创建了一个简单的UI,并将其转换为Python代码。我搜索了任何方法来检测不断变化的窗口大小。 这是生成的代码: 我发现类似的问题QWidget调整大小信号吗?而本教程将介绍建议重写 QMainWindow的 resizeEvent 方法的大小。 __ 但是他们中的任何一个都不能解决我的问题。是否有任何 调整大小的 功能来检测窗口的大小,如下所示: 问题答案

  • 我有一个窗口与列表框,调整大小与彼此。我用网格来做这个。列表框下面有一排按钮,它们当前正在随着窗口移动和调整大小。我希望按钮保持原位,并在窗口和列表框调整大小时保持一致的大小(所以按钮总是保持在列表框的左下角)。 有简单的方法吗?我今天才开始使用Tkinter,所以我可能只是在文档中错过了它,或者可能只是在网格布局上感到困惑。 按钮设置如下: 我已经尝试了所有粘性组合,但那些不调整按钮大小的组合仍

  • 问题内容: CSS3的resize属性可以分配给任意元素。我正在寻找一种方法来检测divs的这种大小变化(我不介意目前仅在Firefox中有效): 不幸的是,该事件似乎并未在div上触发。发生这种由用户指示的调整大小时,如何在JavaScript中进行检测? 编辑: FWIW我已经在Mozilla打开了一个错误报告。 问题答案: 听事件。从这个答案中得到了想法,这个jsFiddle似乎可以在Fir

  • 问题内容: 当用户结束调整浏览器窗口大小时,jQuery或JavaScript有什么办法触发函数? 换句话说: 用户调整浏览器窗口大小时是否可以检测到鼠标向上移动事件?除此以外: 我可以检测到窗口调整大小操作何时完成吗? 我目前只能在用户开始使用jQuery调整窗口大小时触发事件 问题答案: 您可以使用每次实际改变宽度/高度时获取,如下所示: 它会使用新的高度/宽度值并在页面中对其进行更新以供您查

  • 我是一个新的android开发和我正在尝试创建和应用程序与网格菜单,菜单。 当前依赖项:compile fileTree(目录:“libs”,include:['*.jar'])testCompile“junit:junit:4.12”编译组:“org.apache.httpcomponents”,名称:“httpclient-android”,版本:“4.3.5.1”编译组:“cz.mseber