我使用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非常有用.那谢谢啦!
解决方法
查看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") { ... } } }
应该在你想要的时候完成你的活动.