此bounty已结束.回答此问题可获得+150声望奖励。赏金宽限期10小时后结束。zoldxk希望引起更多关注此问题。
我用netbeans启动了一个新的java项目,我创建了一个JFrame
,然后启动了我的应用程序,然后我注意到在调整窗口大小时出现了一个黑色背景。
import javax.swing.JFrame;
public class SimpleJFrameExample {
public static void main(String[] args) {
// Create a new JFrame
JFrame frame = new JFrame();
// Set the size of the JFrame
frame.setSize(400, 300);
// Make the JFrame visible
frame.setVisible(true);
// Set the default close operation when the user clicks the close button
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
字符串
的数据
正如你所看到的,有一个黑色的背景显示(在这种情况下,我',调整大小的权利)。
我发现:
这显然与承载JFrame的窗口的本机窗口装饰有关
从这个answer和它建议使用JFrame.setDefaultLookAndFeelDecorated(boolean)
。我试了一下,得到了:
的
它的作品,并没有显示任何背景时,resuzing,但不是我想我的窗口看起来像,所以我想知道是否有一种方法来阻止这种影响,并保持正常的窗口装饰。
的
2条答案
按热度按时间gzszwxb41#
我通过设置一个计时器来减少这个延迟,该计时器每隔100 ms重新验证和重绘一次组件:
字符串
还有更好的办法吗?
啊,我不会一直这样做,如果你是这样做的,那很贵。
很可能是
updateScaledImage
阻塞了事件调度线程,阻止了UI的绘制,直到它完成,或者是您的绘制例程在绘制过程中阻塞了事件调度线程,但这都是猜测,因为您没有提供可运行的示例。如前所述,可能的原因是在代码中的某个地方,识别它是另一个问题。
我在过去所做的是使用“合并回调”与快速/低质量缩放方法相结合。
这意味着,在调整大小事件之间有足够的延迟之前,我将使用快速/低质量缩放方法将“某些内容”渲染到屏幕上。一旦在调整大小事件之间出现“足够的延迟”,我就会在后台线程中触发一个慢/高质量的缩放通道,最终用这个版本更新UI。
现在请记住,Swing是单线程的,不是线程安全的。这意味着您不应该在事件调度线程内执行阻塞或长时间运行的操作,也不应该从事件调度线程外更新UI(或UI所依赖的任何状态)。
为此,我创建了Swing
Timer
(用作我的“合并回调”工作流)和SwingWorker
来执行高质量的缩放。x1c 0d1x的数据
AlphaComposite
,这样您就可以看到“高质量”图像何时可用。*型
请注意,这只是所描述方法的一种实现,您可能会找到更适合您自己需要的不同实现方式。
ujv3wf0j2#
我确实找到了一个导致您所描述的行为的Toolkit属性:
字符串
如果我把它改回“true”,问题就消失了:
型
不知道在默认情况下如何或在何处将此属性设置为“false”。