对于这个有点不清楚的问题表示歉意 - 想不出更好的表达方式。
我使用 JXTaskPane (来自 Swing 实验室扩展 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();
}
}
问题是 componentResized 方法在任务 Pane 展开时被调用,结果 resizeFrame 方法被调用了很多次,并且在屏幕上看起来非常糟糕。
如何检测 JXTaskpane 何时完成大小调整?我想到了两种方法:
将 resizeFrame() 方法放入 SwingUtilities.invokeLate(..) 调用中。
放入计时器 resizeFrame 调用,因此在计时器触发之前,任何后续调用都不会执行任何操作。这应该给面板足够的时间来调整大小。
最好的前进方向是什么?
此外 - 这是我在多年服务器端程序之后的第一个严肃 Java GUI 应用程序。 StackOverflow 非常有帮助。非常感谢!
最佳答案
我知道您已经选择了一个答案,但是重写 paint 方法绝对是不正确的,虽然您可以就地破解一些东西,但这并不理想。
查看 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") {
...
}
}
}
应该在您需要的时候准确地获得您的 Activity 。
在 Swing 中监听事件的正确方法是通过属性监听器。不幸的是,找出正确的属性和值的唯一方法是挖掘源代码。
关于Java Swing : Do something when a component has *finished* resizing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2340987/
Ruby最近停止在我兄弟的机器上工作。gem命令rails服务器rails控制台全部失败并出现以下错误:$irbirb(main):001:0>require'digest/sha1'LoadError:dlopen(~/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/x86_64-darwin12.2.0/digest/sha1.bundle,9):Symbolnotfound:_rb_Digest_SHA1_FinishReferencedfrom:~/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/x86_64-da
做音频处理(虽然它也可以是图像处理)我有一个一维数字数组。(它们恰好是代表音频样本的16位有符号整数,这个问题同样适用于float或不同大小的整数。)为了匹配不同频率的音频(例如,将44.1kHz样本与22kHz样本混合),我需要拉伸(stretch)或压缩值数组以满足特定长度。将数组减半很简单:每隔一个样本丢弃一次。[231,8143,16341,2000,-9352,...]=>[231,16341,-9352,...]将数组宽度加倍稍微不那么简单:将每个条目加倍(或可选地在相邻的“真实”样本之间执行一些插值)。[231,8143,16341,2000,-9352,...]=>[2
我有这个代码:我的JavaScript代码:$('#child').resizable({animate:true,helper:'.ui-resizable-helper',maxWidth:500,maxHeight:500,aspectRatio:true});使用上面的代码,我的可调整大小的div按预期工作,但是当我添加containment选项时,div的width和height调整大小为0,在任何方向调整大小时。$('#child').resizable({animate:true,helper:'.ui-resizable-helper',maxWidth:500,max
window.resize()和window.on('resize',function())有什么区别在jquery中? 最佳答案 来自jQuery页面.resize():Thismethodisashortcutfor.on('resize',handler).和.on()是:The.on()methodattacheseventhandlerstothecurrentlyselectedsetofelementsinthejQueryobject.AsofjQuery1.7,the.on()methodprovidesallfu
我需要你们的帮助。我正在使用indexedDB。我需要使用Javascript从数据库中的表中读取记录,但我收到一条错误消息,指出来自Chrome浏览器V52UncaughtInvalidStateError:Failedtoreadthe'result'propertyfrom'IDBRequest':请求未完成。下面是我的Javascript代码变量数据库;varavailableJobs=0;window.indexedDB=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexe
我有一个非常简单的DIV元素,我正在尝试调整它的大小并进行水平拖动。它工作正常,但jQueryUI也更改了DIV元素的高度。我不明白为什么。有什么想法吗?JS代码:$('.task').draggable({axis:'x'}).resizable({containment:'parent',handles:'e,w'});HTML代码:CSS代码:li{height:20px;line-height:20px;list-style:none;}.task{height:16px;margin-top:2px;position:relative;}.taskspan{display:b
我尝试从iframe内部监听iframe宽度/高度的变化:$(window).resize(function(){alert('1oninsideiframe');});或:$(window.parent).find('iframe').resize(function(){alert('2oninsideiframe');});但是当iframe大小改变时没有任何反应。(我需要一个跨浏览器的解决方案:IE7、Chrome、Firefox、Safari。) 最佳答案 $(body).resize(function(){alert('o
我正在尝试通过collectionFS中的gm进行一些图像处理,因为我需要读取一个流并将其写回同一个文件,我必须使用一个临时文件-如下所示。我想检查图像是否大于1000像素。在这种情况下,它的大小应重新调整为1000像素。不幸的是,这不起作用,因为我收到错误TypeError:Object[objectObject]hasnomethod'pipe'和Error:gm().stream()orgm().write()带有不可读流。varfs=Npm.require('fs'),file=Images.findOne({_id:fileId}),read=file.createReadS
我正在寻找一种允许用户使用句柄和所有相关光标调整div大小的简单方法。我看到很多使用jquery的示例,但我想在React中使用它,不需要jquery。有谁知道这样做的简单方法吗?我假设纯js,css。我真的不想为此使用react组件,因为我需要在标准div上启用调整大小。当然,它是与reactjs一起使用的,有没有更现代的方法可以在没有jquery的情况下做到这一点?**编辑**这些是可用于每个可调整大小的点的光标e-resizene-resizen-resizenw-resizes-resizese-resizew-resizesw-resize 最佳答
一、报错信息之前写代码时碰到了这样一个错误:RuntimeError:Expectedtohavefinishedreductionintheprioriterationbeforestartinganewone.Thiserrorindicatesthatyourmodulehasparametersthatwerenotusedinproducingloss.Youcanenableunusedparameterdetectionby(1)passingthekeywordargumentfind_unused_parameters=Truetotorch.nn.parallel.Dist