Swing中的自定义绘图循环

时间:2014-09-07 15:56:53

标签: java swing loops graphics drawing

我正在努力学习如何在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(); 
         }
      });
   }
}

2 个答案:

答案 0 :(得分:2)

绘制一系列复杂的回调和对系统内变化的响应。要记住的第一件事是你不能控制绘画过程,而是向系统提出建议,以便它可以决定重绘的内容和时间......

请查看Painting in AWT and SwingPerforming Custom Painting了解详情。

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

请查看2D Graphics,特别是查看Shape

部分

MouseInfo是一种非常糟糕的方法,可以为此目的检测鼠标的位置,相反,您应该使用MouseListener and/or MouseMotionListener来检测鼠标事件。

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

释放鼠标按钮后,您将提交"当前"塑造模型,因此每次调用paintComponent时都会绘制它。

答案 1 :(得分:0)

这是tobais_k,我现在回答这个问题!

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