2011-09-27 64 views
1

我有一個擴展JPanel並繪製三角形的類。我從其他課程中調用它來創建三個三角形,但是當繪製第三個三角形時,前兩個三角形消失了。我如何添加多個顯示在一起的三角形。 代碼如下:將多個組件添加到Jframe.getcontentpane()

Triangle.Java:

public class Triangle extends JPanel{ 

    Point p1, p2, p3; 
    public Triangle(Point _p1, Point _p2, Point _p3) 
    { 
     this.p1=_p1; 
     this.p2=_p2; 
     this.p3=_p3; 
    } 

    public void paint(Graphics g) 
    { 
     super.paint(g); 
     int[] xs = {p1.x,p2.x,p3.x}; 
     int[] ys = {p1.y,p2.y,p3.y}; 
     Polygon triangle = new Polygon(xs, ys, xs.length); 
     g.fillPolygon(triangle); 
    } 

} 

SwingApplication.java:

public class SwingApplication { 

    public static void main(String[] args) { 
     Triangle triangle1=new Triangle(new Point(120,10), new Point(170,110),new Point(220,10)); 
     Triangle triangle2=new Triangle(new Point(120,210), new Point(170,110), new Point(220,210)); 
     Triangle triangle3=new Triangle(new Point(10,400), new Point(170,210), new Point(320,400)); 
     JFrame frame = new JFrame("Swing Application - Question 2"); 
     //frame.setLayout(new FlowLayout()); 
     frame.getContentPane().add(triangle1); 
     frame.getContentPane().add(triangle2); 
     frame.getContentPane().add(triangle3); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 450); 
     //frame.pack(); 
     frame.setVisible(true); 
    } 

} 

回答

5

如果你想吸引他們所有的在一個地方,然後做 - 將它們全部繪製在同一個JPanel的paintComponent方法中(而不是繪製方法)。一種方法是將Triangle類從JPanel類中分離出來,給你的Triangle類一個public void draw(Graphics g)方法,給你的JPanel 3 Triangle實例(或者一個Triangle的ArrayList),然後讓JPanel的paintComponent方法調用繪製(圖形g)它所擁有的所有三角形對象。

另一方面,如果您想讓每個三角形顯示在其自己的JPanel中,並且將面板並排顯示或一個顯示在另一個下面(您的問題在此問題上不明確),那麼您需要學習佈局管理器教程,並使用這些知識將contentPane的佈局設置爲將輕鬆顯示多個JPanel的佈局。目前,您將所有Triangle/JPanel添加到contentPane,並且您會在教程中找到頂級容器(即JFrame)的contentPane使用BorderLayout作爲其默認佈局管理器。如果您將組件添加到BorderLayout使用容器中而不指定位置,則它將落入BorderLayout.CENTER位置,並將覆蓋之前添加的任何內容。

+0

我打算使用separete JPanel,但您的建議是正確的, paint vs paintComponent +1 – mKorbel

+0

你可以提一下你提到的一些教程。 – user906763

+2

@ user906763你可能想看看[這裏](http://download.oracle.com/javase/tutorial/uiswing/layout/index.html) – Howard

0

我有同樣的問題,並嘗試在每次添加到contentPane後,在我的應用程序中調用frame.revalidate()和frame.repaint()方法,它工作正常。我不知道,它有多經常,但對我很好。

frame.getContentPane().add(triangle1); 
frame.revalidate(); 
frame.repaint(); 
frame.getContentPane().add(triangle2); 
frame.revalidate(); 
frame.repaint(); 
frame.getContentPane().add(triangle3); 
frame.revalidate(); 
frame.repaint();