2010-11-05 89 views
0

我有JFrame,並且我用paintComponent()方法添加了我的JPanel類。例如,我繪製了紅色的矩形,並且在做了一些動作之後,我想繪製出綠色的橢圓形。我試圖在JPanel中撥打repaint()方法,但沒有任何反應。請幫幫我!JPanel重繪問題

UPDATE:這只是示例代碼

public class Test extends JFrame implements ActionListener{ 
private Container content; 
private MyPanel em; 
private JButton btn; 
    Test() { 
     super("test"); 
     content = getContentPane(); 
     em = new MyPanel(); 
     conent.add(em); 
     btn = new JButton("Draw"); 
     btn.addActionListener(this); 
     content.add(btn); 
    } 

    public void actionPerformed(ActionEvent e) { 
       em.setShape("oval"); 
    }   

public class MyPanel extends JPanel { 
private String shape = "rectangle"; 
    MyPanel() 
    { 
    } 
    setShape(String shape){ 
     this.shape = shape; 
     repaint(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if(shape == "rectanle") 
      g.drawRectangle(100,25,100,200); 


     } 
     else if(shape == "oval"){ 
      g.drawOval(100, 25, 175, 175); 
     } 
} 
+1

您的問題中沒有足夠的信息開始回答。您需要發佈代碼(儘可能少的代碼來重現問題),以及您期望看到什麼行爲,實際看到的內容以及您認爲問題可能存在的細節。 – 2010-11-05 19:55:46

+0

您是否使用-DPleaseRepaintMyPanelPromptly標誌運行程序? – 2010-11-05 19:57:24

+0

這是一個笑話順便說一句。 – 2010-11-05 19:58:21

回答

1

嘗試用"oval".equals(shape)代替shape == "oval"。在Java中,根據equals()等於的字符串不一定等於==

另外,我建議你用常量替換字符串文字:

class Whatever { 
    private final static String OVAL = "oval"; 

    public void process(String arg) { 
     if (OVAL.equals(arg)) { 
      // Do something 
     } 
    } 
} 

,以避免拼寫錯誤的問題(比如你有一個「矩形」和「rectanle」)。

您可以添加調試語句來檢查actionPerformed方法是否真的被調用,以及查看何時執行paintComponent並追蹤通過代碼執行的路徑。

順便說一句,張貼的代碼不應該編譯:你有不匹配的大括號。

2

嘗試在javax.swing.RepaintManager調用markCompletelyDirty(myComponent)