gpt4 book ai didi

Java swing - super.paintcomponent(g) - repaint()

转载 作者:行者123 更新时间:2023-11-30 04:09:00 24 4
gpt4 key购买 nike

我有两个类,如下所示,在 MyPanel 类中,我重写了 paintComponent 方法以将我自己的“绘图”添加到 JPanel 。我调用了 super.paintComponent(g) ,因为据我了解,当我使用自己的继承方法实现时,我还会重写此方法的标准“隐藏”功能。我知道,如果我想在 myPanel 上使用 setBackground/setBorder 等方法,我必须从扩展类中调用 PaintComponent 方法,以使其以自己的标准方式工作(绘制背景、绘制边框等)。

因此,在我看来,每次按下鼠标按钮时,我都会调用 moveSquare 方法,并且它将调用 repaint 方法。当调用 repaint 方法时,程序将转到重写的 PaintComponent 方法。我知道当我使用

repaint(squareX, squareY, squareW, squareH);

在 moveSquare 方法中,它只会重新绘制红色方 block (背景不会被重新绘制),这就是为什么我会在面板上看到每个红色方 block 。我知道如果我在第一次调用中使用 repaint() 然后用这样的参数重新绘制:

                    repaint();
squareX=x;
squareY=y;
repaint(squareX, squareY, squareW, squareH);

它将重绘背景,然后绘制一个正方形,因此我只能看到面板上最后一个红色绘制的正方形。我不明白的是为什么使用参数双重调用 repaint 方法:

                    repaint(squareX, squareY, squareW, squareH);
squareX=x;
squareY=y;
repaint(squareX, squareY, squareW, squareH);

将首先绘制一个具有背景颜色的正方形,然后绘制红色正方形(它的行为就像我在不带参数的情况下调用重绘,然后使用参数重绘)。

抱歉这么长的解释,但我认为如果是的话,指出我的错误会更容易我将解释我认为它应该如何工作。

SwingMoveSquare演示类

public class SwingMoveSquareDemo {

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable(){

public void run(){
System.out.println("GUI started");
createGUI();

}

});


}

public static void createGUI(){

JFrame f = new JFrame("Move square demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new MyPanel());

f.pack();
f.setVisible(true);


}





}

MyPanel 类

public class MyPanel extends JPanel {

private int squareX=1;
private int squareY=1;
private int squareW=20;
private int squareH=20;

public MyPanel(){

setBackground(Color.GRAY);
setBorder(BorderFactory.createLineBorder(Color.WHITE));
setPreferredSize(new Dimension(400,250));


addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
System.out.println("mouspressed");
moveSquare(e.getX(),e.getY());
}
});




}

private void moveSquare (int x, int y){


repaint(squareX, squareY, squareW, squareH);
squareX=x;
squareY=y;
repaint(squareX, squareY, squareW, squareH);





}



public void paintComponent(Graphics g){

super.paintComponent(g);

System.out.println("paint component");

g.setColor(Color.RED);

g.fillRect(squareX, squareY, squareW, squareH);


}


}

最佳答案

paintComponent代表们 ComponentUI#update ,它设置 Graphics上下文的颜色到组件的背景颜色并填充 0, 0, c.getWidth(), c.getHeight() (其中 c 是对已绘制组件的引用)。

基本上,这意味着,即使您使用 repaintrepaint(x, y, width, height) ,背景开始完全更新。

不同之处在于 Graphics剪辑更改。调用repaint时,当使用 repaint(x, y, width, height) 时,剪辑将是组件的大小。 ,剪辑形状将与您传递给它的值相同。

您可能想看看Painting in AWT and Swing了解更多详情。

请记住,Swing 中的绘画是在 RepaintManager 的控制之下的。 ,它将决定应该绘制什么内容以及何时绘制。当它决定需要进行更新时,它将把一个“paint”事件放入事件队列中,该事件将在将来的某个时间由事件调度线程进行处理。这意味着,在大多数情况下,绘画不是立即的......

关于Java swing - super.paintcomponent(g) - repaint(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20083404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com