Luh*_*har 8 java swing jxtaskpane
对这个有点不明确的问题道歉 - 想不出更好的方法.
我使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在任务窗格扩展时调用componentResized方法,因此调用resizeFrame方法很多次,并且在屏幕上看起来非常糟糕.
如何检测JXTaskpane何时完成大小调整?我想到了两种方法:
将resizeFrame()方法放在SwingUtilities.invokeLate(..)调用中.
放入一个timer 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") {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
应该在你想要的时候完成你的活动.
在Swing中侦听事件的正确方法是通过属性侦听器.不幸的是,找出正确属性和值的唯一方法是挖掘源代码.
| 归档时间: |
|
| 查看次数: |
3965 次 |
| 最近记录: |