gpt4 book ai didi

java - 我的 JPanel 拒绝聚焦

转载 作者:行者123 更新时间:2023-12-02 06:36:07 24 4
gpt4 key购买 nike

jf 是一个 JFrame 我试图每 200 毫秒移动一个像素。我创建了这个方法,这样我就可以在继续之前将软件暂停 200 毫秒。 millis 和 millisn 是静态多头。

public static void waitsec() {

millis =System.currentTimeMillis();
millisn =System.currentTimeMillis();
while (millisn<(millis+200)){
millisn=System.currentTimeMillis();
}
}

以下部分是我尝试让 JPanel (jp) 在按下按钮时缓慢移动 50 像素的部分:

public void actionPerformed(ActionEvent h){
if (h.getSource() == button){
for (int i = 0; i <50; ++i){
waitsec();
out.println ("" + i);//I'm checkinf if the waitsec() is working OK
x +=1;
jp.setLocation(x, 0);
totalGUI.repaint();
jp.setVisible(true);//setting visible so I could focus on it
jp.requestFocusInWindow (); //suspicious part
jp.requestFocus ();
}}
}

运行该程序的结果是:正如预期的那样,数字一个接一个地出现在控制台中,它们之间的间隔为 200 毫米。一旦数字停止出现(程序运行完毕),JPanel 就不会一直移动。如果我尝试最小化和最大化窗口,直到程序运行完毕它才会显示,就好像程序根本没有焦点一样......尽管我已将其设置为可见并聚焦,但为什么它没有聚焦?

最佳答案

很多事情......

首先,您阻塞了事件调度线程,阻止它处理任何新事件,包括重绘事件。这将使您的应用程序看起来就像挂起一样,因为本质上它已经挂起。

其次,您应该利用可用的 API 功能,而不是滚动您的 waitSec 方法,而不是尝试循环直到某个时间段过去,这会消耗 CPU 周期,您应该使用 Thread.sleep 来代替。

话虽如此,你永远不应该在 EDT 期间 sleep 。

相反,您应该使用类似 javax.swing.Timer 的东西,它可以配置为定期引发事件。这样做的好处是它在 EDT 的上下文中引发事件,从而可以安全地从内部更新 UI(与创建自己的线程不同)

看看Concurrency in SwingHow to use Swing Timers了解更多详情

第三,JPanel 默认情况下不可聚焦,因此调用 requestFocusInWindow 不太可能产生任何效果

第四,默认情况下,Swing 使用布局管理器,因此您实际上可能也在为此苦苦挣扎

关于java - 我的 JPanel 拒绝聚焦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19624507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com