2016-12-01 17 views
0

JPanelとJFrameで乱数(ランダムなサイズと色)を描画するアプリケーションを作成しました。すべてが正しいと思われますが、コードを実行すると楕円形が描画されません。私は空白の画面を受信します(JFrameは表示されますが、空白のみです)。JPanelの描画の楕円の問題

MyOval、DrawPanel、DrawTestの3つのクラスがあります。

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を使用して、これを達成するために楕円形のプロパティを取得することを検討してください。

あなたはY2を無視X2バグ設定複製しているとしても、これは間違っている:

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

多くの感謝!私は疲れているからです;) –