Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的JPanel拒绝专注_Java_Swing_Focus - Fatal编程技术网

Java 我的JPanel拒绝专注

Java 我的JPanel拒绝专注,java,swing,focus,Java,Swing,Focus,jf是一个JFrame,我试图每200毫秒移动一个像素。我创建了这个方法,所以我可以在使用之前暂停软件200毫秒。毫和毫是静态长 public static void waitsec() { millis =System.currentTimeMillis(); millisn =System.currentTimeMillis(); while (millisn<(millis+200)){ mil

jf是一个JFrame,我试图每200毫秒移动一个像素。我创建了这个方法,所以我可以在使用之前暂停软件200毫秒。毫和毫是静态长

public static void waitsec() {

        millis =System.currentTimeMillis();
        millisn =System.currentTimeMillis();
            while (millisn<(millis+200)){
                millisn=System.currentTimeMillis();
            }
                }
publicstaticvoidwaitsec(){
毫秒=System.currentTimeMillis();
millisn=System.currentTimeMillis();
而(毫许多事情

首先,您正在阻止事件调度线程,阻止它处理任何新事件,包括重新绘制事件。这将使您的应用程序显示为已挂起,因为本质上,它已挂起

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

尽管如此,你永远不应该在EDT的环境下睡觉

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

查看和了解更多详细信息

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


第四,默认情况下,Swing使用布局管理器,因此您可能实际上也在努力解决这一问题

只是一个旁注,a似乎更适合您要做的事情。您还没有把所有事情都说清楚。您在哪个线程中控制移动?您的动作侦听器是如何使用的?您暂停的方式线程突然出错。使用
while(true)
循环运行200毫秒。你认为它在这200毫秒内会做多少次循环!!@Sage,基于OP在
actionPerformed
方法中执行此操作的事实,它很可能是在EDT内执行的-这仍然是一个假设,但我相信我们可以依赖它来实现高分辨率…@madprogramr、 一开始我这么想,赶紧写了一个答案。然后,当我再次看到他停止使用while(true)循环的方法时,我不得不后退一步(@Sage您的提问还是很好的,因为没有什么可以阻止OP从不同的线程手动调用
actionPerformed
,但是添加了问题的描述,OP做了什么变得很明显(从我的角度来看,您经常看到这个问题):Pmy timer可以很好地打印数字。为什么不用于jpanel?这真的是一个焦点问题吗?我可以不使用计时器解决它吗?Swing是一个单线程模型,任何阻止它处理其事件(包括绘制事件)的事情都可以,将阻止它更新UI。
System.out
是一个即时结果。不,如果不使用某种后台计时器,您无法解决它,
javax.swing.timer
是最安全、最简单的选择,因为您不需要将调用重新同步到EDT的上下文中。
我可以解决吗不使用计时器就可以使用它?
如果不是更好的方法,为什么两个人会建议使用计时器?两次都建议使用上档计时器。
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 ();  
}}
}