我确定这是一个简单的答案,但我无法弄明白。
我正在尝试制作一个可以在窗口中控制的基本形状。显然,当整个项目完成时,它会更多地参与进来,但我仍然在进行早期的步骤。我使用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();
}
}
^这个有我的形状图和移动/重新绘制方法。它主要来自我在本网站上发现的其他例子。
感谢先进的任何帮助。
答案 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!