2010-11-05 87 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)