2012-07-09 117 views
2

我想建立一個應用程序,我打算創建一些基本的動畫。我的目標是在上面繪製圖形的面板和下面帶有常規按鈕和標籤的面板。如何在形狀中繪製shapens?

我已經完成了下面介紹的代碼,但是我沒有在先前繪製的矩形內繪製矩形。我相信我的問題是我正在調用一個類(矩形)來繪製擴展JPanel的矩形,這意味着每次我嘗試繪製一個新的矩形時,都會創建一個不與前一個矩形重疊的新面板!

編輯

我擡頭看一些例子,最後能想出一個代碼來生成形狀(矩形這種情況下),因爲我需要他們在同一個面板上。我對代碼做了一些更改,下面是新代碼。

L.java

import java.awt.Color; 
import java.awt.Container; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

class L extends JFrame { 

public static final int ww = 1000; 
public static final int wh = 600; 
public static final String wt = "Teste"; 
Container pane = getContentPane(); 
DrawRectangle rectangle = new DrawRectangle(); 

public L() { 
    setSize(ww,wh); 
    this.setTitle(wt); 
    Sim(); 
    pane.add(rectangle); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
} 

public void addRectangle(int px, int py, int pwh, Color pc) { 
    this.rectangle.addRectangle(px, py, pwh, pc); 
} 

public void Sim() { 
    addRectangle(100,100,250,Color.red); 
    addRectangle(200,200,50,Color.green); 
} 

public static void main(String[] args) { 

    L l = new L(); 

    try { 
     UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
    } catch (UnsupportedLookAndFeelException ex) { 
     ex.printStackTrace(); 
    } catch (IllegalAccessException ex) { 
     ex.printStackTrace(); 
    } catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 

    //} 

} 

} 

DrawRectangle.java

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Rectangle2D; 
import java.util.ArrayList; 
import javax.swing.JPanel; 

class DrawRectangle extends JPanel { 
private java.util.List<Rectangle2D> squares; 
private java.util.List<Color> colors; 
//private int a, startX, startY; 
public DrawRectangle(){ 
    squares = new ArrayList<Rectangle2D>(); 
    colors = new ArrayList<Color>(); 
} 

public void addRectangle(int px, int py, int pwh, Color pc) { // square 
    squares.add(new Rectangle2D.Double(px, py, pwh, pwh)) ; 
    colors.add(pc); 
    //this.a = a; 
    //this.startX = startX; 
    //this.startY = startY; 
} 
public void paintComponent(Graphics g) { 
    Graphics2D g1 = (Graphics2D) g; 
    for(Rectangle2D rect : squares) { 
     System.out.println(colors); 
     g1.setColor(colors); 
     g1.draw(rect); 
    } 
} 
} 

一個新的問題現在已經站起身!我做錯了什麼,我不能使用顏色我傳遞給方法來繪製不同顏色的形狀?

+1

那麼第一件事是你的Rectangle類不能擴展一個JPanel類,如果你想在一個面板上繪製多個矩形 – 2012-07-09 17:35:54

+0

謝謝你的回答!我環顧四周,設法做了一些有用的事情。但是,我有一個新的小問題,介意看看它? – 2012-07-09 22:10:11

+0

@LuisAfonsoTeixeira提出問題,獲得答案,然後在同一帖子中提出另一個問題被認爲是不好的形式。如果您需要現場調試會話方面的幫助,我認爲Stack Overflow不是執行此操作的最佳位置。 – 2013-03-19 17:17:40

回答

2

嗯那也許是因爲嘗試創建一個JPanel,它接受的Rectangles,然後一個數組吸取那些過於面板像這樣:

import java.awt.*; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class RectangleDrawingTest extends JFrame { 

    public RectangleDrawingTest() { 
     createAndShowUI(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       RectangleDrawingTest drawingTest = new RectangleDrawingTest(); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     setTitle("Rectangle Drawing Test"); 
     setSize(300, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     addComponentsToContentPane(this.getContentPane()); 
     setVisible(true); 
    } 

    private void addComponentsToContentPane(Container contentPane) { 

     Rectangle[] recs = new Rectangle[3]; 
     recs[0] = new Rectangle(100, 100, 150, 100); 
     recs[1] = new Rectangle(100, 100, 125, 75); 
     recs[2] = new Rectangle(100, 100, 100, 50); 

     MyPanel mr = new MyPanel(recs); 

     contentPane.add(mr); 
    } 
} 

class MyPanel extends JPanel { 

    private final Rectangle[] recs; 

    public MyPanel(Rectangle[] recs) { 
     this.recs = recs; 
    } 

    @Override 
    protected void paintComponent(Graphics grphcs) { 
     super.paintComponent(grphcs); 
     grphcs.setColor(Color.BLACK); 
     for (int i = 0; i < recs.length; i++) { 
      grphcs.drawRect(recs[i].x, recs[i].y, recs[i].width, recs[i].height); 
     } 
    } 
} 

附錄:

因爲你有兩個squarescolorArrayList使用for循環這樣一個遞增的變量(正方形大小和顏色大小橫向它們當然是相同的):

+0

謝謝你的回答!我環顧四周,設法做了一些有用的事情。但是,我有一個新的小問題,介意看看它? – 2012-07-09 22:02:15

+0

@LuisAfonsoTeixeira看到編輯後 – 2012-07-09 22:52:09

+0

非常感謝你,這解決了我的問題! – 2012-07-09 23:51:25

1

創建自己的平板狀

class MyPanel extends JPanel{ 
Rectangulo one; 

Rectangulo two; 
public MyPanel(){ 
    one = new Rect...etc.; 
    two = new Rect...etc.; 
} 

public paint(Graphics g){ 
    one.paint(g); 
    two.paint(g); 
    //two is overlapping one 
} 

,並添加到您的JFrame ...

編輯: ...或添加油漆(圖形克)和重繪()到您的JFrame,你重繪你PANEL1 ...

希望它可以幫助...

+0

按照您的說法嘗試一下! – 2012-07-09 17:39:47

+0

謝謝你的回答!我環顧四周,設法做了一些有用的事情。但是,我有一個新的小問題,介意看看它? – 2012-07-09 22:02:46

+0

public paint(Graphics g){g.setColor(color); }我認爲這是它。 – bitwave 2012-07-10 07:36:38