对于这个不清楚的问题,我们深表歉意-想不出更好的解决方法。
我使用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何时完成大小调整?我想到了两种方法:
最好的前进方向是什么?
另外-这是我经过多年服务器端程序开发后的第一个认真的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中监听事件的正确方法是通过属性监听器。不幸的是,找出正确的属性和值的唯一方法是挖掘源代码。