java - 移动 Java Swing 矩形会留下矩形

标签 java swing awt

当我终于想通repaint方法的时候,我遇到了一个问题。我想在屏幕上移动一个矩形,而不是重新绘制它。重绘很好,但它留下了旧的矩形!这是我的代码:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Tutorial3{

    public static void main(String[] agrs){
        createAndStartGui();
    }
    static void createAndStartGui(){
        JFrame f = new JFrame("tutorial 3");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setPreferredSize(new Dimension(500, 300));

        MyPanel panel = new MyPanel();
        f.add(panel);

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

        for (int i = 0; i < 10; i++){
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(Tutorial3.class.getName()).log(Level.SEVERE, null, ex);
            }
            panel.user.move("right");
            panel.repaint();
        }
    }
}

class MyRectangle{
    int x;
    int y;
    public MyRectangle(int x, int y){
        this.x = x;
        this.y = y;
    }
    void move(String direction){
        switch (direction){
            case "up":
                this.y -= 10;
                break;
            case "down":
                this.y += 10;
                break;
            case "left":
                this.x -= 10;
                break;
            case "right":
                this.x += 10;
                break;
            default:
                break;
        }
    }
}

class MyPanel extends JPanel{
    MyRectangle user = new MyRectangle(10, 10);
    public MyPanel(){

    }
    public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        g.drawRect(user.x, user.y, 10, 10);
    }

}

如何让留下的矩形消失(我不想清除整个窗口)?或者更好的是,如何让矩形“移动”(如果可能的话)?

我的最终结果:

enter image description here

我到底想要什么:

enter image description here

注意:简单地在该点绘制矩形并不是我想要的。我想看到它被拖过去。

最佳答案

您的问题是您只绘制了矩形,而不是整个面板,因此当您调用该方法时,面板最终会充满矩形。您还需要绘制面板的背景。这将“删除”之前的矩形,因此面板只有您在该特定调用中绘制的内容,而不是您之前所做的内容。为此,您需要调用:

super.paintComponent(g);

paintComponent 方法的开头(在绘制任何其他内容之前)。这是可行的,因为 paintComponent 在空 JPanel 中唯一需要做的就是绘制背景。

所以:

public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g.drawRect(user.x, user.y, 10, 10);
}

编辑:

回答您的一些评论:

I want to move a rectangle across the screen, rather than re-drawing it again.

没有“移动”矩形这样的事情。你可以在屏幕上画东西。如果你想看到其他东西,你必须画那些其他东西。没有固有的“将像素的颜色移动到像素......”,这不是它的工作原理。你想要东西吗?画他们。你想让他们搬家吗?在不同的位置重复绘制它们。

(I DO NOT WANT TO CLEAR THE FULL WINDOW)

但你知道。每次需要更改时,您都想重新绘制整个面板。如果面板中还有其他您不想“删除”的内容,请重新绘制它们。

需要明确的是,可以只清除“旧”矩形位置并绘制一个新矩形,而不会影响面板的其余部分。但这是不必要的棘手。当您覆盖 paintComponent 时,在第一行调用 super.paintComponent(g) 是标准过程。不放它必须是一个非常有意识的决定,你最好确定你在做什么。

如果您的程序以某种方式完成,当您重新绘制面板的背景时,您的部分代码行为不当,我可以自信地告诉您,那是那些设计不佳的部分,而不是调用 super .paintComponent(g) 是个坏主意。

paintComponent 负责绘制整个组件。背景是组件的一部分。在 Swing 中,当您覆盖它时执行它是自然而好的设计。

关于java - 移动 Java Swing 矩形会留下矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24169253/

相关文章:

java - 使用 Java 以编程方式下载 CSV 文件

java - 保存数据并创建一个不包含该数据的新面板

java - MediaTracker - 如何使用它,有什么好处,或者有替代品吗?

java - 设置 JFrame 的背景颜色

java - 有没有JList的懒加载实现?

java - 使用 Hibernate 和 TreeSet 无法使用remove() 和 contains() 方法

java - JComponents (Swing) 的二维网格

java - 通过监听器从网格面板更新组件

java - Hibernate 在 SpringMVC 中的连接表上重复输入

java - JScrollPane 没有按预期工作,为什么?