对于这个不清楚的问题,我们深表歉意-想不出更好的解决方法。
我使用JXTaskPane(来自Swing Labs扩展API)来显示一些信息。
用户可以“单击”标题以展开面板。 JXTaskPane位于容器JPanel中,然后将其添加到我的主应用程序窗口JFrame中。
我希望我的应用程序窗口能够调整为扩展后的任务 Pane 的大小。为了实现这一点,我向容器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();
    }
}
问题在于,随着任务 Pane 的扩展, componentResized 方法被调用,结果resizeFrame方法被调用了很多次,并且在屏幕上看起来真的很糟糕。
如何检测JXTaskpane何时完成大小调整?我想到了两种方法:
  • 将resizeFrame()方法放入SwingUtilities.invokeLate(..)调用中。
  • 放入计时器resizeFrame调用,因此任何后续调用都不会执行任何操作,直到计时器触发为止。这应该给面板足够的时间来调整大小。

  • 最好的前进方向是什么?
    另外-这是我经过多年服务器端程序开发后的第一个认真的Java GUI应用程序。 StackOverflow很有帮助。那谢谢啦!

    最佳答案

    我知道您已经选择了一个答案,但是重写绘画方法绝对是不正确的,尽管您可以破解某些内容,但它并不是理想的选择。

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

    由于您确实有权访问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中监听事件的正确方法是通过属性监听器。不幸的是,找出正确的属性和值的唯一方法是挖掘源代码。

    10-04 12:48