java - 不确定为什么这个图形屏幕没有更新

标签 java swing graphics awt

这是我正在尝试重绘但未正确重绘的屏幕。

 public class arenaScreenBuild extends JPanel{
     int pX=200, pY=150;
     public void updateScreen(){
         repaint();
     }
     public void paintComponent(Graphics g) {
         g.drawString("x:"+pX, 535, 525);
         g.drawString("y:"+pY, 535, 545);       
     }
     public void refreshXY(int x, int y){
         pX=x;
         pY=y;
         System.out.println("Refreshed X&Y");
         updateScreen();
     }
 }

这是显示图形的屏幕。运行时,每次我移动(按向右箭头键)时,它都会显示“Refreshed X&Y”,但即使它调用了 updateScreen() 方法,也不会重新绘制显示的项目。如果代码有效,则应在“刷新的 X&Y”之后显示 x:XVALUE、y:YVALUE。

 public class ArenaKeys extends KeyAdapter {
     arenaScreenBuild arenaBG = new arenaScreenBuild();
     int xPos = 0, playerFace = 4,xPPos = 200, yPPos = 150;

     public void keyPressed(KeyEvent e) {
         int keyCode = e.getKeyCode();
         if (keyCode == e.VK_RIGHT) {
             if (xPos <= 3250) 
               if (((xPos + xPPos) >= 825) && ((xPos + xPPos) <= 910)
                       && (yPPos >= 170) && (yPPos <= 255)) {
               } else if (((xPos + xPPos) >= 1325) && ((xPos + xPPos)<= 1410)
                       && (yPPos >= 170) && (yPPos <= 255)) {
               } else
                   xPos += 5;
           }
           arenaBG.refreshXY(xPPos+xPos,yPPos);
       }
    }

编辑: *事实证明它确实有效,但我所做的是在另一个抽屉面板的顶部添加一个抽屉面板,而这段代码是针对下面的那个,所以它没有让底部代码更新,我通过将两个绘图面板的两个代码合并在一起解决了这个问题。*

最佳答案

在 keyPressed 调用 EventQueue.invokeLater(new Runnable()) 中,因为 keyPressed 是在事件处理线程上调用的,所以必须推迟重绘。


有一个 AWT 事件队列,事件在一个线程中处理。当一个事件被处理时,比如 keyPressed GUI 被卡住;其他事件不并行处理。

因此此类事件不应花费很长时间或更改显示。

解决方案是推迟要执行的代码。

这可以通过以下方式完成:

EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        ... the code ...
    }
 });

在 Java 中,有一个线程(进程)在无限循环中处理 GUI 事件,例如 keyPressed、按钮单击或(间接)paintComponent。为此存在一个事件等待队列,称为 java.awt.EventQueue

所以这些事情不是并行进行的。这种限制使编码更简单,并且可以更好地映射到操作系统,例如旧的 MacOS。

因此,当调用 keyPressed 时(在事件线程上),对重绘的调用将不起作用,因为稍后必须在同一线程上的 repaintComponent 上进行处理。

解决方案是调用 invokeLater,它将带有 Runnable 的事件放置在事件队列中供稍后使用。

关于java - 不确定为什么这个图形屏幕没有更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13943463/

相关文章:

java - Animate ball JPanel subclass is not abstract错误

c++ - 如何用四元数来描述大于360度的旋转角度?

java - java中同时输入多个String数据

java - 来自Java,学习C++——理解函数指针

java - println 不打印期望值

java - 为什么当我更改 Java 8 版本(从 8u45 到 8u171)时我的颜色主题会改变?

java - 通过 SSH 在远程计算机上运行 jar 时未创建日志

java - JScrollPane 和大小问题

Java JApplet 在移动旧矩形后不会将其删除

opengl - 可在 OpenGL 中表示的曲线