2016-12-01 6 views
0

Я создал приложение, которое рисует случайное число овалов (со случайными размерами и цветами) с JPanel и JFrame. Кажется, все правильно ... но ни один овал не рисует, когда я выполняю код. Я получаю только пустой экран (появляется JFrame, но только пустое).Проблемы с JPanel с чертежными овалами

У этого есть 3 класса: MyOval, DrawPanel и DrawTest.

MyOval Класс

package drawingovals; 

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

public class MyOval { 
    private int x1; 
    private int y1; 
    private int x2; 
    private int y2; 
    private Color myColor; 
    private boolean isFilled; 

    public MyOval(int x1, int y1, int x2, int y2, Color color, boolean isFilled) { 
     this.x1 = x1; 
     this.y1 = y1; 
     this.x2 = x2; 
     this.x2 = x2; 
     myColor = color; 
     this.isFilled = isFilled; 
    } 

    public int getUpperLeftX(){ 
     return x1; 
    } 

    public int getUpperLeftY(){ 
     return y1; 
    } 

    public int getWidth(){ 
     return x2 - x1; 
    } 

    public int getHeight() { 
     return y2 - y1; 
    } 

    public String getColor() { 
     return myColor.toString(); 
    } 

    public boolean getFilling(){ 
     return isFilled; 
    } 

    public void setUpperLeftX(int value) { 
     x1 = value; 
    } 

    public void setUpperLeftY(int value) { 
     y1 = value; 
    } 

    public void setDownRightX(int value) { 
     x2 = value; 
    } 

    public void setDownRightY(int value) { 
     y2 = value; 
    } 

    public void drawNoFill(Graphics g) { 
     g.setColor(myColor); 
     g.drawOval(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight()); 
    } 

    public void drawFill(Graphics g) { 
     g.setColor(myColor); 
     g.fillOval(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight()); 
    } 
} 

DrawPanel Класс

package drawingovals; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Random; 
import javax.swing.JPanel; 

public class DrawPanel extends JPanel{ 
    private Random randomNumbers = new Random(); 
    private MyOval[] ovals; 

    public DrawPanel() { 
     setBackground(Color.WHITE); 

     ovals = new MyOval[5 + randomNumbers.nextInt(5)]; 

     for (int count = 0; count < ovals.length; count++) { 
      int x1 = randomNumbers.nextInt(300); 
      int y1 = randomNumbers.nextInt(300); 
      int x2 = randomNumbers.nextInt(300); 
      int y2 = randomNumbers.nextInt(300); 

      Color color = new Color(randomNumbers.nextInt(256), 
        randomNumbers.nextInt(256), randomNumbers.nextInt(256)); 

      boolean fill = randomNumbers.nextBoolean(); 

      ovals[count] = new MyOval(x1, y1, x2, y2, color, fill); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (int count = 0; count < ovals.length - 1; count++) { 
      ovals[count].drawFill(g); 
     } 
    } 
} 

DrawTest Класс

package drawingovals; 

import javax.swing.JFrame; 

public class DrawTest { 

    public static void main(String[] args) { 
     DrawPanel panel = new DrawPanel(); 
     JFrame application = new JFrame(); 

     application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     application.add(panel); 
     application.setSize(400, 400); 
     application.setVisible(true); 
    } 

} 

ответ

2

Вы должны принять что ваши овальные высоты и ширина содержат только положительные значения - ваш код этого не делает. Рассмотрите возможность использования Math.max, Math.min или Math.abs при получении ваших свойств оваля, чтобы помочь вам достичь этого.

Кроме того, это не так, как вы дублируя настройки x2 ошибка игнорирования y2:

this.x1 = x1; 
    this.y1 = y1; 
    this.x2 = x2; // *** these are the same 
    this.x2 = x2; // *** these are the same 

Что-то, как это будет работать:

public MyOval(int x1, int y1, int x2, int y2, Color color, boolean isFilled) { 
    this.x1 = Math.min(x1, x2); 
    this.y1 = Math.min(y1, y2); 
    this.x2 = Math.max(x1, x2); 
    this.y2 = Math.max(y1, y2);; 
    myColor = color; 
    this.isFilled = isFilled; 
} 

В будущем, ключ к решению этих типов проблем заключается в использовании отладчика для проверки полей вашей программы, здесь овальных свойств, как работает программа, а затем посмотреть, не имеют ли они смысла, а потом почему.

+0

Большое спасибо! Это потому, что я устал;) –

 Смежные вопросы

  • Нет связанных вопросов^_^