来自Swing Library的drawRect / fillRect问题(包含图像)

时间:2014-11-10 03:32:50

标签: java swing rectangles

刚开始使用Swing来解决Java中的类项目GUI。我试图绘制一个游戏板,但不是传统的游戏板。我试图再画一个parchessi board,所以每个棋盘都需要有一个特定的位置,而不是一个网格。

到目前为止,我遇到了这个问题。在paint()中,我正在尝试绘制5个矩形,奇怪的是蓝色和空的,甚至是红色并填充。但是,我得到了这个而不是一个漂亮的方格图案:

enter image description here

任何人都可以帮我弄明白为什么会这样做吗?

代码:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Rectangles extends JPanel {

   public static void main(String[] a) {
      JFrame f = new JFrame();
      f.setSize(800, 800);
      f.add(new Rectangles());
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.setVisible(true);
   }

   public void paint(Graphics g) {
      int x = 15;
      int y = 15;
      int w = 15; 
      int h = 15;
      for(int i = 0; i < 5; i++){
          if(i%2==0){
              g.setColor(Color.RED);
              g.fillRect (x, y, x+w, y+h);
          }
          else{
              g.setColor(Color.BLUE);
              g.drawRect (x, y, x+w, y+h);
          }
          x+=15;
          System.out.println(Integer.toString(x) + ' ' + Integer.toString(y) + '|' + Integer.toString(w) + ' ' + Integer.toString(h));
      }
   }
}

Println语句的输出(x,y,width,height):

30 15|15 15
45 15|15 15
60 15|15 15
75 15|15 15
90 15|15 15

看起来第一张图片中有重叠,所以我修改了代码并尝试了这个:

  for(int i = 0; i < 5; i++){
      g.setColor(Color.BLUE);
      g.drawRect (x, y, x+w, y+h);    
      x+=15;
   }

以下是此代码所发生的情况:

enter image description here

为什么会有重叠?是什么原因造成的?

另外,有没有人知道制作易于修改的矩形数组的好方法?或者任何有关绘制此类董事会的好建议或工具?

1 个答案:

答案 0 :(得分:1)

欢迎您不要破坏油漆链的原因......

在进行任何自定义绘画之前,先致电super.paint(g)作为paint方法的第一行。

更好的解决方案是覆盖paintComponent而不是paint,但仍然要确保在执行任何自定义绘画之前调用super.paintComponent ...

请查看Performing Custom PaintingPainting in AWT and Swing了解详情

接下来,开始阅读JavaDocs on Graphics#fillRect,你会看到最后两个参数代表宽度和高度,而不是底角的x / y位置

public class Rectangles extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int x = 15;
        int y = 15;
        int w = 15;
        int h = 15;
        for (int i = 0; i < 5; i++) {
            if (i % 2 == 0) {
                g.setColor(Color.RED);
                g.fillRect(x, y, w, h);
            } else {
                g.setColor(Color.BLUE);
                g.drawRect(x, y, w, h);
            }
            x += 15;
            System.out.println(Integer.toString(x) + ' ' + Integer.toString(y) + '|' + Integer.toString(w) + ' ' + Integer.toString(h));
        }
    }
}