2014-11-10 1 views
0

Только что начал возиться с Swing для GUI проекта класса в Java. Однако я пытаюсь нарисовать игровой доску, а не обычный. Я пытаюсь сделать еще один, как parchessi board, поэтому каждая плитка должна иметь определенное местоположение, а не сетку.Проблема с drawRect/fillRect из Swing Library (включая изображения)

До сих пор я столкнулся с этой проблемой. . В краске(), я пытаюсь нарисовать 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 (х, у, ширина, высота):

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

Добро пожаловать причинам вы не должны нарушить лакокрасочное цепь ...

Start, вызвав super.paint(g) в первой строке вашего метода paint, прежде чем делать какие-либо пользовательские картины.

Лучшим решением было бы переопределить paintComponent вместо paint, но все же убедившись, что вы звоните super.paintComponent, прежде чем выполнять какие-либо пользовательские картины ...

Посмотрите на Performing Custom Painting и Painting 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)); 
     } 
    } 
} 
+0

Спасибо большое! Я пойду проверю разницу между краской и компонентом paint. – TaylorTheDeveloper

+0

Рад, что это может помочь ... – MadProgrammer