我想在java中使用事件处理的图形
问题定义:我想用java中的图形来打印球和一个矩形,球应该通过箭头键或移动鼠标朝矩形移动 代码的问题是它一次又一次地打印球,我只想打印一次球我想在java中使用事件处理的图形,java,graphics,Java,Graphics,问题定义:我想用java中的图形来打印球和一个矩形,球应该通过箭头键或移动鼠标朝矩形移动 代码的问题是它一次又一次地打印球,我只想打印一次球 public class MouseGui extends javax.swing.JFrame implements MouseMotionListener, MouseListener, KeyListener { int x = 10, y = 10; public MouseGui() { ini
public class MouseGui extends javax.swing.JFrame implements
MouseMotionListener, MouseListener, KeyListener {
int x = 10, y = 10;
public MouseGui() {
initComponents();
addKeyListener(this);
addMouseListener(this);
}
@Override
public void paint(final Graphics g) {
g.setColor(Color.red);
g.fillOval(x, y, 50, 50);
g.setColor(Color.blue);
g.fillRect(200, 300, 100, 80);
if (x > 180 || y > 280) {
g.drawString("Target hit!!", 80, 20);
}
}
public static void main(final String args[]) {
MouseGui obj = new MouseGui();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MouseGui().setVisible(true);
}
});
}
@Override
public void mouseMoved(final MouseEvent e) {
x = e.getX();
y = e.getY();
repaint();
}
@Override
public void keyPressed(final KeyEvent e) {
int a = e.getKeyCode();
if (e.getKeyCode() == VK_UP) {
y = y - 10;
repaint();
} else if (e.getKeyCode() == VK_DOWN) {
y = y + 10;
repaint();
} else if (e.getKeyCode() == VK_RIGHT) {
x = x + 10;
repaint();
} else if (e.getKeyCode() == VK_LEFT) {
x = x - 10;
repaint();
}
}
}
下面是此代码如何显示输出:
问题不在于球被涂了多次,而在于旧的图纸从未被清除 重写绘制方法时,建议调用超级方法,以便它首先执行自己的操作 在此处调用
super.paint(g)
将清除Graphics
对象:
@Override
public void paint(final Graphics g) {
super.paint(g);
g.setColor(Color.red);
g.fillOval(x, y, 50, 50);
g.setColor(Color.blue);
g.fillRect(200, 300, 100, 80);
if (x > 180 || y > 280) {
g.drawString("Target hit!!", 80, 20);
}
}
此外,正如@JoopEggen所建议的,在对Swing组件进行自定义绘制时,通常使用较低级别的组件,如JPanel
,并覆盖其paintComponent
方法,即:
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(x, y, 50, 50);
g.setColor(Color.blue);
g.fillRect(200, 300, 100, 80);
if (x > 180 || y > 280) {
g.drawString("Target hit!!", 80, 20);
}
}
请参阅本课程以获取一些示例:调用
super.paintComponent(g)
是必须的。如果您希望人们尝试阅读代码,请考虑正确缩进代码。使用paintComponent而不是paint.thnx大量使用代码