2013-04-08 75 views
2

我想繪製一個橢圓形在另一個橢圓形。 這裏我使用select語句繪製paint組件方法。繪畫到彼此頂部的物體

import java.awt.*; 

public class test extends JPanel{ 

public static final int OVAL = 1; 
public static final int SOLID = 2; 

private int type = LINE; 

public test(int type){ 

    this.type = type; 
} 
public void piantComponent(Graphics g){ 
    super.paintComponent(g); 

    switch(type) 
    { 
     case OVAL: 
     g.setColor(Color.YELLOW); 
     g.drawOval(0,0,150,150); 
     break; 

     case SOLID: 
     g.setColor(Color.BLUE); 
     g.fillOval(0,0,50,50); 
     break; 

    } 
} 


} 

現在在我的主要方法,我想顯示一個黃色的橢圓形(OVAL)內的一個堅實的藍色橢圓形(固體)。

import...; 
    public class Main{ 
     public static void main (String [] args){ 
      JFrame window = new JFrame(); 
      window.add(new test(test.OVAL)); 
      window.add(new test(test.SOLID)); 
      window.setSize(300,300); 
      window.setVisible(true); 

     } 

    } 

這並沒有做我想要它做的事情。這隻顯示一個橢圓形,而不是一個橢圓形和一個堅實的。我認爲我超載的窗口只顯示橢圓形。我曾嘗試使用佈局管理器(網格佈局)進行顯示,但不顯示這兩幅作品相互之間顯示兩幅相鄰的作品。

如何解決這個問題,而不會失去switch語句。

+0

使用適當的Java類名稱。 「測試」不是標準名稱。類名以大寫字符開頭。 – camickr 2013-04-08 15:42:29

回答

1
window.add(new test(test.OVAL)); 
window.add(new test(test.SOLID)); 

你的問題與順序,以便做。爲了簡化,Swing以與在面板上找到的順序相反的順序來繪製組件。所以在你的情況下,SOLID在OVAL之前被繪製。由於OVAL尺寸較大,因此覆蓋了SOLID。

您可以強制的Swing做油漆的成分中更直觀的順序:

window.add(0, new test(test.OVAL)); 
window.add(0, new test(test.SOLID)); 

現在添加的最後一個組件也將最後上漆。

但是更好的設計是創建單獨的橢圓和實體類,以便您可以獨立指定大小,位置和顏色。然後,您可以根據需要添加儘可能多的組件。

0

爲什麼你不只是一個接一個地畫一個呢?這樣的:

g.setColor(Color.YELLOW); 
    g.drawOval(0,0,150,150); 
    g.setColor(Color.BLUE); 
    g.fillOval(0,0,50,50); 
+1

但是,如果我不想失去Switch語句?我可以用switch語句繪畫,但它只會顯示其中一幅畫,而不是兩幅畫。這意味着一個會覆蓋另一個。如果我使用佈局管理器,它將顯示爲彼此相鄰,而不是彼此重疊。 – Jonathan 2013-04-08 13:26:47

0

嘗試是這樣的(只是用片段):

private ArrayList<int> ovals = new ArrayList<int>(); 


public test(int type) { 
     ovals.add(type); 
} 



public void piantComponent(Graphics g) 
{ 
     super.paintComponent(g); 

     for(int oval : ovals) 
     { 
      switch(type) 
      { 
       case OVAL: 
       g.setColor(Color.YELLOW); 
       g.drawOval(0,0,150,150); 
       break; 

       case SOLID: 
       g.setColor(Color.BLUE); 
       g.fillOval(0,0,50,50); 
       break; 
      } 
     } 
} 

這將允許您根據需要添加任意多橢圓形(雖然它們的靜態定位,將只寫了他們在畫布上)。你可以嘗試使用一個布爾數組並遍歷它來查看是否需要繪製一個特定的類型,如果你只需要每個類型中的一個。

1
  • Painting in Swing必須做具體JComponent

  • public class test{(用正確的命名規則,並改變testText)不包含任何JComponents

  • 使用JPanel或純JComponent

  • 繪畫在AWT,Sw默認情況下,荷蘭國際集團永遠不會返回PreferredSize,然後容器具有零Dimensionrequired to override getPreferredSize

+0

請注意,這不是我的實際程序! – Jonathan 2013-04-08 14:00:23

+0

super.paintComponent(g);清除以前的所有繪畫 – mKorbel 2013-04-08 14:03:23

1
  1. 修改測試類。閱讀註釋以解釋修改

import java.awt。*;

公共類測試擴展JPanel {

public static final int OVAL = 1; 
    public static final int SOLID = 2; 
    **public static final int BOTH = 3;** //instance variable to represent the 
             //painting of both images 

    private static int type; 

    public test(int type){ 
    this.type = type; 
    } 

    public void paintComponent(Graphics g){ 

    switch(type) 
    { 
     case OVAL: 
      g.setColor(Color.BLACK); 
      g.drawOval(0,0,150,150); 
      break; 

     case SOLID: 
      g.setColor(Color.BLUE); 
      g.fillOval(0,0,50,50); 
      break; 

     case BOTH:      //statements to draw both figures 
      g.setColor(Color.BLACK); 
      g.drawOval(0,0,150,150); 
      g.setColor(Color.BLUE); 
      g.fillOval(0,0,50,50); 
      break; 

    } 
    }//paint component 

}

  1. 中的主要方法使用

    window.add(新的測試(test.BOTH);