Java Swing:在组件*完成*大小调整时执行某些操作
对这个有点不明确的问题道歉 – 想不出更好的方法.
我使用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(..)调用中. 前进的最佳方式是什么? 此外 – 这是我经过多年服务器端程序后的第一个认真的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中侦听事件的正确方法是通过属性侦听器.不幸的是,找出正确属性和值的唯一方法是挖掘源代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |