2017-05-25 9 views
0

私はJavaをかなり新しくしています(約8ヶ月間コーディングしています)、JPanelでシェイプを描くときにいくつか問題があります。マウスをクリックしてドラッグすると、すでに図形を描くことができます。私が持っている問題は、以下のとおりです。私は形が描かれているクラスに色を渡すしようとすると、色がシェイプを描くときにシェイプのプロパティがクラス間で正しく渡されない - Java Swing

  • 更新し、既定の色(黒)としてとどまりません。

  • (setStrokeメソッドを使用して)私のシェイプのpointSizeを変更しようとすると、最初に描くシェイプがpointSizeを正しく更新しますが、次に描画するシェイプはデフォルトのpointSizeになります。 (pointSizeが新しいシェイプを描画するたびにリセットされるように見えます)

ロングストーリーショート;新しいオブジェクトをインスタンス化する方法や、他のクラスに値を渡す方法には何か問題があると思います。私は他の人の質問から答えを探していましたが、何が間違っているのか分かりません。ここ

は私のコードである:

私inputHandlerクラス:

myRectangleクラス(矩形が描画されているクラス): `パッケージ色;

 import java.awt.BasicStroke; 
     import java.awt.Color; 
     import java.awt.Graphics2D; 
     import java.awt.geom.Rectangle2D; 

     public class myRectangle implements Drawable { 

      private double x1, y1, x2, y2; 
      DrawPanel dp; 
      public Color color; 
      public static boolean paint; 
      public int pointSize; 

      public myRectangle() { 

      } 

      public myRectangle(double x1, double y1, double x2, double y2) { 
       this.x1 = x1; 
       this.y1 = y1; 
       this.x2 = x2; 
       this.y2 = y2;  
      } 

      @Override 
      public void draw(Graphics2D g) {   
       double x = getStartX(); 
       double y = getStartY(); 
       double width = getWidth(); 
       double height = getHeight(); 
       Rectangle2D r = new Rectangle2D.Double(x, y, width, height);   
       g.setColor(color);  
       g.draw(r);   
       g.setStroke(new BasicStroke(pointSize)); 
       if(paint) 
       { 
        g.fillRect((int)x, (int)y, (int)width, (int)height);    
       } 

       System.out.println("rectangle called"); 
      } 





      public boolean contains(double x, double y) { 
       return x >= getStartX() && x <= getEndX() && y >= getStartY() && y <= getEndY(); 
      } 

      public double getWidth() { 
       return Math.abs(x1 - x2); 
      } 

      public double getHeight() { 
       return Math.abs(y1 - y2); 
      } 

      public double getStartX() { 
       return Math.min(x1, x2); 
      } 

      public double getStartY() { 
       return Math.min(y1, y2); 
      } 

      public double getEndX() { 
       return Math.max(x1, x2); 
      } 

      public double getEndY() { 
       return Math.max(y1, y2); 
      } 

      public String getShape() 
      { 
       return "Rectangle"; 
      } 

      public void setStroke(int stroke) 
      { 
       pointSize = stroke; 
      } 


      public void setColor(Color color) 
      { 
       this.color = color; 
      } 
     }` 

私DrawPanelクラス(JPanelの上に図形を描画するクラス): `パッケージの色。ここ

 import java.awt.Graphics; 
     import java.awt.Graphics2D; 
     import java.util.ArrayList; 

     import javax.swing.JPanel; 

     @SuppressWarnings("serial") 
     public class DrawPanel extends JPanel 
     { 
      public ArrayList<Drawable> shapesList = new ArrayList<Drawable>(); 
      public static int pointSize; 



      public DrawPanel() 
      { 
       super(); 
      } 



      @Override 
      public void paintComponent(Graphics g) 
      { 
       super.paintComponent(g);    

       // Cast the graphics object to type Graphics2D 
       Graphics2D g2d = (Graphics2D) g;  
       // Loop through the shapesList and draw every shape 
       for(Drawable s : shapesList) 
       { 
        s.draw(g2d);   
       } 

      } 







     }` 

そして最後に私のプログラムがどのように見えるかの基本的な理解を得るための画像です:image of my program

は、私は、これは多くのコードですけど、私はしばらくの間、これらの問題にstruggelingされています今私は何が間違っているのか分かりませんので、ついに投稿をすることに決めました。

ご協力いただきありがとうございます。

-Mick

+0

「約8ヶ月間コーディングしています」 - クラス名は大文字で始まることがわかります。 Javaの規約に従ってください。 – camickr

+0

新しいペイントサイクル – MadProgrammer

答えて

1

かいつまん。私は新しいオブジェクトをインスタンス化する方法に間違っていると思うし、他のクラスに値を渡す方法

はい、作成時にシェイプオブジェクトのすべてのパラメータを設定していません。

rectangle.setColor(Color.red); 
ellipse.setColor(Color.red);     
line.setColor(Color.red); 

上記のカラーボタンをクリックすると、既存のオブジェクトの色を設定できます。

rectangle = new myRectangle(startx,starty,x,y); 
dp.shapesList.add(rectangle); 

しかし、その後、あなたは新しいオブジェクトを作成し、リストにオブジェクトを追加しますが、色を設定することはありません。

オブジェクトの作成時にすべてのパラメータを設定する必要があります。

"RED"ボタンは、シェイプオブジェクトが作成されるときに使用される次の色のクラスの変数を設定するだけです。

矩形を描画するときの色を設定する作業例については、Custom Paintingを参照してください。

また、「ペイント」ボタンを使用する代わりに、shapeListにシェイプを追加した後にrepaint()を呼び出します。 「塗料」変数は必要ありません。 draw()メソッドが呼び出されるたびにシェイプをペイントするだけです。

+0

をトリガーするために 'DrawPanel'のインスタンスで' repaint'を呼び出します。myRectangleクラスで変数を作成してから、REDボタンをクリックしてその変数を変更する必要があると言っていますか? like:rectangle.color = Color.red;しかしsetColorが正しいことはそうですか? myRectangleクラスの変数 "color"を変更します – Mick

+0

適切なクラス名を使用してください! 'myRectangle'は適切なクラス名ではありません!コメントを読む。いいえ、それは私が言っているものではありません。クラス内の変数で、RED、BLUE、およびGREENボタンを定義します。いずれかのボタンをクリックすると、単一の変数が設定されます。次に、MyRectangleクラスを作成するときにその変数を使用します。 – camickr

+0

あなたの答えはありがたいですが、気にする必要はありません。 – Mick

関連する問題