gpt4 book ai didi

java - 在java中更新后调用绘制图形

转载 作者:行者123 更新时间:2023-12-02 03:29:02 25 4
gpt4 key购买 nike

问题:

每次按下 w、a、s 或 d 键后,用户的 x 和 y 都会发生变化,并且正方形会绘制到 x 和 y 上,这意味着图形不会更新。我的问题是你如何更新它?我尝试过以各种可能的方式在任何地方使用重绘,并且开始认为这不是问题。有人可以告诉我我做错了什么或者如何解决这个问题。我对 Java 还很陌生,所以如果我犯了一个非常简单的错误,请原谅。

代码:

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class KeyPressDrawing extends JFrame implements KeyListener{
// define variables
public static int user_x = 50;
public static int user_y = 50;

// init
public KeyPressDrawing(String s){
super(s);
JPanel area = new JPanel();
add(area);
setSize(800, 800);
setVisible(true);
addKeyListener(this);
setResizable(false);
}

// draw
public void paint(Graphics g) {
g.setColor (Color.black);
// x position, y position, width length, height length
g.fillRect(KeyPressDrawing.user_x, KeyPressDrawing.user_y, 50, 50);
repaint();
}

// check and change

public void keyTyped(KeyEvent e) {}


public void keyPressed(KeyEvent e) {}


public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W) {
System.out.println("Up");
KeyPress.user_y -= 20;

}
if (e.getKeyCode() == KeyEvent.VK_A) {
System.out.println("Left");
KeyPress.user_x -= 20;

}
if (e.getKeyCode() == KeyEvent.VK_S) {
System.out.println("Down");
KeyPress.user_y += 20;

}
if (e.getKeyCode() == KeyEvent.VK_D) {
System.out.println("Right");
KeyPress.user_x += 20;
}
}

public static void main(String[] args){
new KeyPressDrawing("Control Panel");
}
}

最佳答案

您的代码存在一些问题。首先,您将 JPanel 作为 JFrame 中的主要小部件,但随后您重写 JFrame 本身的 paint 方法,并且从不将调用委托(delegate)给父类(super class),因此您的 JPanel 将不会被渲染。您可能想要做的是将矩形的绘制移动到 JPanel 子类中,该子类是框架的主要子窗口小部件。然后,在您的 keyReleased 方法中调用子窗口部件的 repaint 方法。每次释放按键后,子面板将被告知需要重新绘制。删除 JFrame 的 paint 方法并使用默认值。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;


public class Sample extends JFrame implements KeyListener {
public int user_x;
public int user_y;
public Canvas canvas;

class Canvas extends JPanel{
public Canvas() {
setSize(getPreferredSize());
Canvas.this.setBackground(Color.white);
user_x = 10;
user_y = 10;
}

@Override
public final Dimension getPreferredSize() {
return new Dimension(600, 600);
}

@Override
public final void paintComponent(final Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
Ellipse2D circle = new Ellipse2D.Double(0d, 0d, 100d, 100d);
g2d.setColor(Color.red);
g2d.translate(user_x, user_y);
g2d.draw(circle);
g2d.fill(circle);
}
}

public Sample() {
super("Sample");
setSize(300, 300);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
public void windowOpened(WindowEvent e) {}
});
canvas = new Canvas();
getContentPane().add(canvas);
addKeyListener(this);
}


// Implementation of java.awt.event.KeyListener

public final void keyTyped(final KeyEvent keyEvent) {

}

public final void keyPressed(final KeyEvent keyEvent) {

}

public final void keyReleased(final KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W) {
System.out.println("Up");
user_y -= 20;
}
if (e.getKeyCode() == KeyEvent.VK_A) {
System.out.println("Left");
user_x -= 20;
}
if (e.getKeyCode() == KeyEvent.VK_S) {
System.out.println("Down");
user_y += 20;
}
if (e.getKeyCode() == KeyEvent.VK_D) {
System.out.println("Right");
user_x += 20;
}
//either canvas.repaint or just repaint for the frame will work here
repaint();
}

public static final void main(final String[] args) {

Sample f = new Sample();
f.setVisible(true);
}

} // Sample

关于java - 在java中更新后调用绘制图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38350807/

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