加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:50:47 所属栏目:Java 来源:网络整理
导读:对这个有点不明确的问题道歉 – 想不出更好的方法. 我使用JXTaskPane(来自Swing labs扩展API)来显示一些信息. 用户可以“单击”标题以展开面板. JXTaskPane位于容器JPanel中,然后将其添加到我的主应用程序窗口JFrame中. 我希望我的应用程序窗口调整为扩展任
对这个有点不明确的问题道歉 – 想不出更好的方法.

我使用JXTaskPane(来自Swing labs扩展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();
    }
}

问题是在任务窗格扩展时调用componentResized方法,因此调用resizeFrame方法很多次,并且在屏幕上看起来非常糟糕.

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

>将resizeFrame()方法放在SwingUtilities.invokeLate(..)调用中.
>输入一个定时器resizeFrame调用,因此任何后续调用都不会执行任何操作,直到定时器触发.这应该为面板调整大小提供足够的时间.

前进的最佳方式是什么?

此外 – 这是我经过多年服务器端程序后的第一个认真的Java GUI应用程序. StackOverflow非常有用.那谢谢啦!

解决方法

我知道你已经选择了一个答案,但是重写paint方法肯定是不正确的,虽然你可能能够破解某些东西,但它并不理想.

查看JXTaskPane的源代码并特别查看setExpanded()(第387行),您可以看到它调用JXCollapsiblePane.setCollapsed(…)然后触发属性更改事件以进行扩展.该属性上的侦听器将不正确,因为它将在动画完成之前触发.因此,如果你进入JXCollapsiblePane并查看setCollapsed(…)(第470行),你会看到如果它是动画的,它会设置参数并启动一个计时器.我们想知道动画何时结束,所以在该文件中,查看动画师(第620行,特别是652-667),它显示动画结束时,它会触发ANIMATION_STATE_KEY的属性更改,其值为“折叠” “或”扩大“.这是你真正想要的事件.但是,您无权访问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中侦听事件的正确方法是通过属性侦听器.不幸的是,找出正确属性和值的唯一方法是挖掘源代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读