2012-03-12 45 views
1

我有這樣一個簡單的應用程序,其中像RECT 10 20 100 150這樣的命令在DrawPanel上繪製了一個帶有指定參數的矩形(擴展爲JPanel)。爲什麼我的繪圖面板,有時繪畫和其他時間沒有,窗口調整大小?

此外,繪製原始之後,將其添加到List<String> cmdList;,使DrawPanel的
paintComponent(Graphics g)我遍歷列表,過程的每個命令,並畫出他們每個人。

問題我面臨的是,在繪製幾個形狀之後,調整大小(或最大化)面板變空。並再次調整大小,所有shpaes得到正確。

這是繪製幾個基元后的屏幕截圖。 enter image description here

將窗口稍微向左拉伸後,圖元就消失了。 enter image description here

DrawPanel代碼

public class DrawPanel extends JPanel { 

    private List<String> cmdList; 
    public final Map<String,Shape> shapes; 

    public DrawPanel() 
    { 
     shapes = new HashMap<String,Shape>(); 
     shapes.put("CIRC", new Circ()); 
     shapes.put("circ", new Circ()); 
     shapes.put("RECT", new Rect()); 
     shapes.put("rect", new Rect()); 
     shapes.put("LINE", new Line()); 
     //... and so on 

     cmdList = new ArrayList<String>(); 
    } 
    public void addCmd(String s) 
    { 
     cmdList.add(s); 
    } 
    public void removeCmd() 
    { 
     cmdList.remove(cmdList.size()); 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     setBackground(Color.BLACK); 

     for (int i = 0; i < cmdList.size(); ++i){ 
      StringTokenizer cmdToken = new StringTokenizer(cmdList.get(i)); 

      String cmdShape = cmdToken.nextToken(); 
      int []args = new int[cmdToken.countTokens()]; 

      for(int i1 = 0; cmdToken.hasMoreTokens(); i1++){ 
       args[i1] = Integer.valueOf(cmdToken.nextToken()); 
      } 

      shapes.get(cmdShape).draw(this, args); 
     } 
    } 

    public void getAndDraw(String cmdShape, int[] args) 
    { 
     shapes.get(cmdShape).draw(this, args); 
    } 
    public void rect(int x1, int y1, int width, int height) 
    { 
     Graphics g = getGraphics(); 
     g.setColor(Color.BLUE); 
     g.drawRect(x1, y1, width, height); 
    } 
    public void circ(int cx, int cy, int radius) 
    { 
     Graphics g = getGraphics(); 
     g.setColor(Color.CYAN); 
     g.drawOval(cx - radius, cy - radius, radius*2, radius*2); 
    } 
} 

形狀(接口)在大型機使用

public interface Shape { 
    void draw(DrawPanel dp, int[] data); 
} 

class Rect implements Shape { 
    public void draw(DrawPanel dp, int[] data) { 
     dp.rect(data[0], data[1], data[2], data[3]); 
    } 
} 

線(延伸JFrame),每個後得出的部分碼命令被輸入。

drawPanel.getAndDraw(cmdShape, args); 
drawPanel.addCmd(cmd); 

爲什麼繪圖面板,有時畫和其他時間沒有,窗口調整大小?
如何獲得穩定的輸出?

注意:如果我遺漏了任何東西,請詢問。

+0

您是否提供SSCCE? – StanislavL 2012-03-12 06:40:35

+0

@StanislavL:SSCCE是一個包含所有相關代碼的文件嗎? – 2012-03-12 06:50:51

回答

3

這是因爲您使用getGraphics()時應該使用Graphics對象作爲參數傳遞給paintComponent。

哦,順便說一句,的setBackground(Color.BLACK)應該是在構造函數,而不是在方法的paintComponent。

+0

謝謝,解決了這個問題:)但有一件事,現在每個函數都有一個額外的參數('Graphics g'),我可以(或應該)避免它嗎? – 2012-03-12 07:04:58

+0

不,我認爲這是做到這一點的最佳方式 – 2012-03-12 08:46:13

相關問題