调用repaint()会绘制新形状,但会留下旧形状

时间:2015-11-10 08:25:11

标签: java swing

我确定这是一个简单的答案,但我无法弄明白。

我正在尝试制作一个可以在窗口中控制的基本形状。显然,当整个项目完成时,它会更多地参与进来,但我仍然在进行早期的步骤。我使用WindowBuilder进行布局,并有一个JPanel和一个JButton。 JPanel绘制一个矩形,并有一个移动它的方法。 JButton调用移动命令。就是这样。问题在于重画。形状保留了自身的所有旧版本,按钮会自行制作奇怪的副本。当我调整窗口大小时,所有这些都消失了,我认为这与调用重绘相同。再说一次,我确信这是我想念的简单事。以下是我的2个课程。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;



public class Drawing {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Drawing window = new Drawing();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Drawing() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    drawpanel panel = new drawpanel();
    panel.setBounds(58, 68, 318, 182);
    frame.getContentPane().add(panel);

    JButton btnMove = new JButton("move");
    btnMove.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            panel.moves();
        }
    });
    btnMove.setBounds(169, 34, 89, 23);
    frame.getContentPane().add(btnMove);

}
}

^除了buttonListener之外,这个由WindowBuilder自动处理。

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class drawpanel extends JPanel {

    int x = 50, y = 50;
    int sizeX = 50, sizeY = 50;

    public void paintComponent( Graphics g) {
        super.paintComponents(g);

        g.setColor(Color.BLACK);
        g.drawRect(x, y, sizeX, sizeY);
    }

    public void moves() {
        x +=5;
        repaint();
    }
}

^这个有我的形状图和移动/重新绘制方法。它主要来自我在本网站上发现的其他例子。

感谢先进的任何帮助。

1 个答案:

答案 0 :(得分:2)

public void paintComponent(Graphics g) {
    super.paintComponents(g); // wrong method! (Should not be PLURAL)

应该是:

public void paintComponent(Graphics g) {
    super.paintComponent(g); // correct method!