Java Swing:在组件*完成*调整大小后执行某些操作

Java Swing:在组件*完成*调整大小后执行某些操作,java,swing,jxtaskpane,Java,Swing,Jxtaskpane,为这个有点不清楚的问题道歉——想不出更好的表达方式 我使用(来自Swing实验室扩展API)来显示一些信息 用户可以“单击”标题以展开面板。JXTaskPane位于容器JPanel中,然后将其添加到JFrame(我的主应用程序窗口)中 我想将我的应用程序窗口调整为扩展任务窗格的大小。为了实现这一点,我在容器JPanel中添加了一个组件侦听器,它将为现在扩展的面板设置大小 panel.addComponentListener(new ComponentListener() { pub

为这个有点不清楚的问题道歉——想不出更好的表达方式

我使用(来自Swing实验室扩展API)来显示一些信息

用户可以“单击”标题以展开面板。JXTaskPane位于容器JPanel中,然后将其添加到JFrame(我的主应用程序窗口)中

我想将我的应用程序窗口调整为扩展任务窗格的大小。为了实现这一点,我在容器JPanel中添加了一个组件侦听器,它将为现在扩展的面板设置大小

panel.addComponentListener(new ComponentListener()
{   
    public void componentResized(ComponentEvent e)
    {
        Dimension newSize = ((JXTaskPane)e.getSource()).getSize();
        reSizeFrame(newSize);
    }
}

private void reSizeFrame(Dimension newSize)
{   
    if ((newSize.height < maxSize.height) && (newSize.width < maxSize.width))
    {
        containerPanel.setSize(newSize);
        appFrame.setSize(containerPanel.getSize());
        appFrame.pack();
    }
}
panel.addComponentListener(新的ComponentListener()
{   
公共无效组件已恢复(组件事件e)
{
维度newSize=((JXTaskPane)e.getSource()).getSize();
调整框架大小(新闻大小);
}
}
专用void reSizeFrame(维度newSize)
{   
if((newSize.height
问题是当任务窗格展开时会调用componentResized方法,结果resizeFrame方法被调用了很多次,在屏幕上看起来非常糟糕

如何检测JXTaskpane何时完成大小调整?我想到了两种方法:

  • 将resizeFrame()方法放入SwingUtilities.invokeLate(..)调用中

  • 放入计时器resizeFrame调用,以便在计时器触发之前,后续调用不会执行任何操作。这应该给面板足够的时间调整大小

前进的最佳途径是什么


此外-这是我在多年的服务器端程序之后第一个严肃的Java GUI应用程序。StackOverflow非常有用。因此,谢谢!

作为建议,您是否尝试过重写paint方法,首先调用super,然后在if(且仅当)结尾处放置调整大小代码大小已发生显著变化。

我不熟悉JXTaskPane,但我的第一反应是,可能您处理了错误的事件。您希望在用户单击标题时调整帧大小-因此为什么不处理该事件(可能在任务窗格调整大小后使用EventQueue.invokeLater()调整帧大小)


但是,如果这不起作用,您需要使用上面概述的方法,那么使用javax.swing.Timer可能是最好的。将其设置为200毫秒左右,然后每次componentResized()时重新启动()激发。

我知道您已经选择了一个答案,但覆盖绘制方法肯定是不正确的,虽然您可以在适当的位置上修改某些内容,但这并不理想

查看setExpanded()的源代码,特别是查看setExpanded()(第387行),您可以看到它调用JXCollapsiblePane.setCollapsed(…),然后为expanded触发属性更改事件。该属性上的侦听器将不正确,因为它将在动画完成之前触发。因此,如果您进入并查看setCollapsed(…)(第470行)您将看到,如果动画设置为动画,它将设置参数并启动计时器。我们想知道动画何时结束,因此在该文件中,请查看动画制作程序(第620行,特别是652-667行),该文件显示动画结束时,它会触发动画状态键的属性更改,值为“折叠”或“扩展”。这是您实际需要的事件。但是,您没有访问JXCollapsiblePane的权限,因此请返回JXTaskPane并搜索ANIMATION_STATE_键,然后找到第208行,该行显示JXTaskPane在JXCollapsiblePane.ANIMATION_STATE_键上创建了一个侦听器,并将其重新设置为自己的事件

由于您确实有权访问JXTaskPane,因此您可以侦听该事件,这样做

taskPane.addPropertyChangeListener(JXCollapsiblePane.ANIMATION_STATE_KEY, new PropertyChangeListener() {
  public void propertyChange(PropertyChangeEvent e) {
    if(e.getNewValue().equals("expanded") {
      ...
    }
    else if(e.getNewValue().equals("collapsed") {
      ...
    }
  }
}
你应该在你想要的时候得到你的活动


在Swing中侦听事件的正确方法是通过属性侦听器。不幸的是,找到正确的属性和值的唯一方法是通过挖掘源代码。

James-谢谢。我将尝试一下。我可能会重写JFrame上的paint方法?是的,我是这么想的,或者在JPanel中(扩展JPanel会让您更好地控制如何在其上进行设置,这往往是我构建GUI的方式,尽管我不能自称是专家)。希望一切顺利!同意w/Gonzo,凌驾于绘画之上()在这种情况下不推荐Fiar enuffski,我说我不是专家,很高兴有一种不太老练的方法来做OP需要的事情