- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(在我的 Swing GUI 应用程序中)我想在单击 JButton 后调用的循环或方法中执行的某些工作期间显示 GlassPane。
例如:(单击按钮后执行的操作)
if (item.equals(button)) {
glassPane.setVisible(true);
someTimeConsumingMethod();
glassPane.setVisible(false);
}
运行此代码会导致在执行 someTimeConsumingMethod() 期间不显示 glassPane - GUI 会在显示结果之前卡住片刻。删除该循环中的最后一行 (glassPane.setVisible(false);) 会导致在方法完成后显示 glassPane(当 GUI 解冻时)。
有没有一种简单的方法可以在 GUI 卡住之前显示 glassPane,或者我需要在这里使用一些高级知识? (线程?)
更新1:
我已根据 davidXYZ 答案更新了我的代码(有两个更改):
(点击按钮后执行的操作)
if (item.equals(button)) {
glassPane.setVisible(true);
new Thread(new Runnable(){
public void run(){
someTimeConsumingMethod(); // 1st change: running the someTimeConsumingMethod in new Thread
// instead of setting glassPane to visible
}
}).start();
// 2nd change: moved glassPane.setVisible(false); inside the someTimeConsumingMethod(); (placed at the end of it).
}
第一个更改的要点是,在我的 GUI 线程中运行 someTimeConsumingMethod 之前在新线程中设置 glassPane 会在 someTimeConsumingMethod 完成后显示 glassPane(仔细检查)。
现在它工作正常,感谢您的所有回答。我一定会检查您提供的所有链接以真正理解线程!
更新 2:更多信息: someTimeConsumingMethod();在我的应用程序中,正在根据 XML 数据准备新的 Swing 组件(从 JButtons 和 JLabels 构建的卡片,在需要的地方很少有 JPanel,并将它们添加到正确的位置)。
UPDATE3:
我正在尝试使用 SwingWorker 的 invokeLater 方法使其工作。现在看起来像这样:
(点击按钮后执行的操作)
if (item.equals(button)) {
glassPane.setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
someTimeConsumingMethod();
glassPane.setVisible(false);
}
});
}
它的效果不如 UPDATE1 的代码好(但仍然有效)。问题是:
glassPane 加载时没有 .gif 动画(文件在自定义 glassPane 类中设置 - 它适用于 UPDATE1 代码)
在“工作”过程结束时有一个小的延迟 - 第一个光标变为正常(从 WAIT_CURSOR),并且在很短的时间之后 glassPane 消失了。光标在激活/停用时由自定义 glassPane 类更改(使用新的 Thread 方式无延迟)。
使用 SwingWorker 的 invokeLater 方法是否正确?
编辑:我的错误,我将 SwingWorker 与 SwingUtilities.invokeLater() 混淆了。我猜图像问题是由于 someTimeCONsumingMethod 启动时 GUI 卡住造成的。
最佳答案
GUI just freezes for a moment, before result is displayed. Removing last line in that loop (glassPane.setVisible(false);) results in showing glassPane after the method is done (when GUI unfreezes).
这是关于 Event Dispath Thread
的常见问题,当 EDT
中的所有事件在某一时刻刷新到 Swing GUI
时,然后一切在 if (item.equals(button)) {
方法中可以一次性完成,
但是你的描述说你在 Swing 中遇到了 Concurency 的问题,一些代码阻塞 EDT,这是一个小的延迟,例如 Thread.sleep(int
) 可能会导致这个问题,不要这样做,或将代码块重定向到背景任务
Is there a simple way to show that glassPane before GUI freezes, or I need to use some advanced knowledge here? (threads?)
这个问题是预订示例为什么存在 SwingWorker
,或者更简单的方法是 Runnable#Thread
在 SwingWorker
中实现的方法可以保证在 EDT 上完成输出
从 Runnable#Thread
到 Swing GUI 的任何输出都应包装在 invokeLater()
Jbuttons Action
中最简单的步骤可能是
显示 GlassPane
从 SwingWorker
启动后台任务(确保通过 PropertyChangeListener
进行监听)或调用 Runnable#Thread
此时 ActionListener
执行完成,其余代码被重定向到后台任务
如果任务结束,则隐藏GlassPane
通过将 setVisible
包装到 invokeLater()
中为 Runnable#Thread
如果您使用 SwingWorker
,那么您可以在 PropertyChangeListener
的适当事件上隐藏 GlassPane
或者您可以使用任何(单独的)void 来隐藏 GlassPane
GlassPane by @camickr 的最佳代码,或我的question about based on this code
关于java - 在进入循环之前显示 GlassPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606123/
我是 PHP 新手。我一直在脚本中使用 for 循环、while 循环、foreach 循环。我想知道 哪个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要
我在高中的编程课上,我的作业是制作一个基本的小计和顶级计算器,但我在一家餐馆工作,所以制作一个只能让你在一种食物中读到。因此,我尝试让它能够接收多种食品并将它们添加到一个价格变量中。抱歉,如果某些代码
这是我正在学习的一本教科书。 var ingredients = ["eggs", "milk", "flour", "sugar", "baking soda", "baking powder",
我正在从字符串中提取数字并将其传递给函数。我想给它加 1,然后返回字符串,同时保留前导零。我可以使用 while 循环来完成此操作,但不能使用 for 循环。 for 循环只是跳过零。 var add
编辑:我已经在程序的输出中进行了编辑。 该程序要求估计给定值 mu。用户给出一个值 mu,同时还提供了四个不等于 1 的不同数字(称为 w、x、y、z)。然后,程序尝试使用 de Jaeger 公式找
我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 if 条件。第一次条件为假时,循环可以终止。 因此,对于 for 循环,如果条件为假,它会继续迭代并进行简单的变量更改
现在我已经习惯了在内存非常有限的情况下进行编程,但我没有答案的一个问题是:哪个内存效率更高;- for(;;) 或 while() ?还是它们可以平等互换?如果有的话,还要对效率问题发表评论! 最佳答
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 8 年前。 我正在尝试创建一个小程序,我可以在其中读取该程序的单词。如果单词有 6
这个问题在这里已经有了答案: python : list index out of range error while iteratively popping elements (12 个答案) 关
我正在尝试向用户请求 4 到 10 之间的整数。如果他们回答超出该范围,它将进入循环。当用户第一次正确输入数字时,它不会中断并继续执行 else 语句。如果用户在 else 语句中正确输入数字,它将正
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我想要做的事情是使用循环创建一个数组,然后在另一个类中调用该数组,这不会做,也可能永远不会做。解决这个问题最好的方法是什么?我已经寻找了所有解决方案,但它们无法编译。感谢您的帮助。 import ja
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我正在模拟一家快餐店三个多小时。这三个小时分为 18 个间隔,每个间隔 600 秒。每个间隔都会输出有关这 600 秒内发生的情况的统计信息。 我原来的结构是这样的: int i; for (i=0;
这个问题已经有答案了: IE8 for...in enumerator (3 个回答) How do I check if an object has a specific property in J
哪个对性能更好?这可能与其他编程语言不一致,所以如果它们不同,或者如果你能用你对特定语言的知识回答我的问题,请解释。 我将使用 c++ 作为示例,但我想知道它在 java、c 或任何其他主流语言中的工
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 C 编程和编写代码的新手,以确定 M 测试用例的质因数分解。如果我一次只扫描一次,该功能本身就可以工作,但是当我尝试执行 M 次时却惨遭失败。 我不知道为什么 scanf() 循环有问题。 in
这个问题已经有答案了: JavaScript by reference vs. by value [duplicate] (4 个回答) 已关闭 3 年前。 我在使用 TSlint 时遇到问题,并且理
我尝试在下面的代码中添加 foreach 或 for 循环,以便为 Charts.js 创建多个数据集。这将允许我在此折线图上创建多条线。 我有一个 PHP 对象,我可以对其进行编码以稍后填充变量,但
我是一名优秀的程序员,十分优秀!