2011-03-13 59 views
3

我只是在Java中进入图形,我有一个问题。我使用JPanel面板创建了一个JFrame窗口(NetBeans Designer),并在其上绘制了一些图形。然后我添加了一个JButton,它改变了一个变量,这会改变JPanel上方块的X位置。在Java中重绘图形

在按钮按下该代码将执行:

drawObject.setX(150); 
drawObject.repaint(); 

drawObject是这个类的一个实例:

public class sola extends JPanel { 

    private int x = 10; 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponents(g); 
     super.setBackground(Color.WHITE); 

     g.setColor(Color.ORANGE); 
     g.fill3DRect(x, 160, 100, 50, true); 
    } 

    public void setX(int xX){ 
     x = xX; 
    } 
} 

现在,当我按下一个JButton,矩形并移动到新位置,但在旧的位置仍然可见。只有当我调整窗口的大小时才会刷新,旧的矩形会消失。我怎样才能解决这个问题,以便当我按下按钮时,矩形只在新位置可见?

+0

为了更快得到更好的帮助,请发布SSCCE(http://pscode.org/sscce.html)。如果您有问题,请不要忘记添加问号(?)。 – 2011-03-13 12:00:24

+1

我对这个第一个问题是一个非常明确的问题。 – Chris 2011-03-13 12:02:20

回答

3

这是

super.paintComponent(g); 

super.paintComponents(g); // note the s at the edn 

两者差别很大!第一个告诉你的JPanel完成通常由paintComponent方法执行的所有管家功能,包括重新绘制背景(项目的关键)。第二,你打电话的那个人没有做任何上述功能。所以我的建议是在超级通话中摆脱尾随的问题。

+0

这工作,谢谢! – Squeazer 2011-03-13 12:27:06

+0

不客气 - 感谢您的反馈! – 2011-03-13 12:34:39

1

您可以使用以下方法JComponent的:(http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html

void repaint(long tm, int x, int y, int width, int height) 
Adds the specified region to the dirty region list if the component is showing. 
void repaint(Rectangle r) 
Adds the specified region to the dirty region list if the component is showing. 

你可以叫那些之前redraw()

1

您可以使用repaint()方法做这件事。

如果在面板上使用paintComponent()。你应该在整个面板上照顾这幅画。您的示例中没有代码需要注意删除旧的绘制矩形。

我推荐为您的矩形创建一个自己的组件。 (你可以从组件扩展),那么你可以重写这些类的paintComponent方法,就像你在面板中做的那样。因为小组应该充当一个容器组件。不像自己绘制矩形。

知道将这些组件的实例添加到普通的JPanel中。这应该会按预期进行更新。