Java Swing中的自定义绘图循环

Java Swing中的自定义绘图循环,java,swing,loops,graphics,drawing,Java,Swing,Loops,Graphics,Drawing,我正在努力学习如何在Java中为我正在从事的一个小组项目定制GUI。我以前做过用户表单类型的GUI,所以我知道我在这里做什么的要点,但是自定义绘图的东西仍然让我困惑 我从网上复制了这段代码,我一直试图弄清楚它是如何工作的,但我不明白为什么我不能循环绘图方法。作为一个简单的测试,我试图让程序在我的光标上画一个椭圆形。它在光标上绘制椭圆,但在运行时只绘制一次,然后什么也不做 我怎样才能做这个循环,这样我就可以继续画东西了?或者我是否需要以不同的方式调用/使用这些方法 public class Bom

我正在努力学习如何在Java中为我正在从事的一个小组项目定制GUI。我以前做过用户表单类型的GUI,所以我知道我在这里做什么的要点,但是自定义绘图的东西仍然让我困惑

我从网上复制了这段代码,我一直试图弄清楚它是如何工作的,但我不明白为什么我不能循环绘图方法。作为一个简单的测试,我试图让程序在我的光标上画一个椭圆形。它在光标上绘制椭圆,但在运行时只绘制一次,然后什么也不做

我怎样才能做这个循环,这样我就可以继续画东西了?或者我是否需要以不同的方式调用/使用这些方法

public class BombermanGUI extends JFrame {
   public static final int CANVAS_WIDTH  = 640;
   public static final int CANVAS_HEIGHT = 480;

   private DrawCanvas canvas;

   public BombermanGUI() {
      canvas = new DrawCanvas();  
      canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));

      Container cp = getContentPane();
      cp.add(canvas);

      this.setDefaultCloseOperation(EXIT_ON_CLOSE);  
      this.pack();             
      this.setTitle("......"); 
      this.setVisible(true);    
   }

   private class DrawCanvas extends JPanel{
      @Override
      public void paintComponent(Graphics g){
         super.paintComponent(g);  
         setBackground(Color.BLACK); 

         int x, y;
         x = MouseInfo.getPointerInfo().getLocation().x - this.getLocationOnScreen().x;
         y = MouseInfo.getPointerInfo().getLocation().y - this.getLocationOnScreen().y;
         g.setColor(Color.YELLOW);    
         g.drawOval(x, y, 10, 10);

      }
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new BombermanGUI(); 
         }
      });
   }
}

这是tobais_k答案,我的回答是结束问题


添加一个事件监听器并让它调用重新绘制方法,例如用于跟踪鼠标光标的鼠标运动监听器,或者让一些线程运行游戏并定期触发重新绘制。

绘制一系列复杂的回调和对系统内更改的响应。要记住的第一件事是,你不控制绘画过程,而是向系统提出建议,这样系统就可以决定应该重新绘画的内容和时间

请查看和以了解更多详细信息

绘画是一个破坏性的过程。假设在重新绘制时,您将重新绘制当前组件的整个状态。这意味着您将需要某种模型来维护所有需要绘制的内容

请看一看,特别是关于
Shape

MouseInfo
是一种非常糟糕的检测鼠标位置的方法,因此,您应该使用来检测鼠标事件

基本上,当用户按下鼠标按钮时,您将记录鼠标按下的位置。移动鼠标时,您将计算相对于鼠标按下的移动的宽度和高度,并更新“当前”形状。您可以调用
repaint
,请求更新UI,并通过
paintComponent
方法绘制此形状(首先绘制之前的所有形状)


释放鼠标按钮时,您将向模型提交“当前”形状,因此每次调用
paintComponent
时都会绘制该形状。

添加事件侦听器,并让它调用
repaint
方法,例如,用于跟踪鼠标光标的鼠标运动侦听器,或者让一些线程运行你的游戏并定期触发
重新绘制
。哎呀,我在删除不必要的部分时把代码搞糟了一点,我现在就来修复它。我也在想办法。啊,重新绘制就是我要找的,这应该可以解决我的问题。谢谢davidpostill的建议。没有答案,所以我不能选择最好的答案…哇,这是一个地狱的很多围绕我的头。幸运的是我有时间把这一切弄清楚,thanks@user2856410从概念上讲,它非常简单(无意冒犯,我知道它看起来非常复杂),问题是,这是一个非线性问题,因为您在事件驱动的环境中运行,所以您需要维护从一个事件到下一个事件的“有状态”细节,这些并不总是直接相关的