gpt4 book ai didi

java - 我在 JFrame 中的重绘不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:23 25 4
gpt4 key购买 nike

我在 JFrame 中重绘有问题我之前在制作动画时使用了 repaint() 并且一切正常

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

public class Draw extends JComponent implements KeyListener {

int x = 0;
int y = 0;

public void paint(Graphics g){
g.setColor(Color.BLUE);
g.fillRect(x, y, 50, 50);
}

public void keyPressed(KeyEvent k) {
if(k.getKeyCode() == KeyEvent.VK_UP){
y -= 2;
} else if(k.getKeyCode() == KeyEvent.VK_DOWN){
y += 2;
} else if(k.getKeyCode() == KeyEvent.VK_LEFT){
x -= 2;
} else if(k.getKeyCode() == KeyEvent.VK_RIGHT){
x += 2;
}

repaint();
}

public void keyReleased(KeyEvent k) {}

public void keyTyped(KeyEvent k) {}

}

这是我的绘图类,如果我作为小程序运行,一切正常,但我不想要小程序

我的框架类

import javax.swing.*;

public class Frame {

Draw d = new Draw();

public Frame(){

JFrame f = new JFrame("Game");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 600);
f.setVisible(true);

f.add(d);
f.addKeyListener(new Draw());
}

}

和我的主课

public class Main {

public static void main(String[] args) {

Frame f = new Frame();

}

}

repaint() 是不工作的,我测试了它工作的关键监听器,那么为什么 repaint() 不工作?

最佳答案

KeyListener 不应该 工作,因为默认情况下 JComponent 无法获得程序焦点,这是 KeyListener 工作的必要条件。一种解决方案是通过 setFocusable(true) 使其可聚焦,然后对其调用 requestFocusInWindow()。最好使用键绑定(bind) ( tutorial link )。请注意,您应该重写 paintComponent,而不是绘画,并且您不应该忘记在您的重写中调用 super 的方法。

For example

编辑:我错了,因为 JFrame 可以 获得焦点并且您正在将 KeyListener 添加到 JFrame。但是您的问题是您正在创建一个新的 Draw 对象来执行此操作,而不是针对原始显示的 Draw 对象。如果您使用相同的 Draw 对象来显示图像和 KeyListener,您的代码实际上可以工作:

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

public class Draw extends JComponent implements KeyListener {
int x = 0;
int y = 0;

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(x, y, 50, 50);
}

public void keyPressed(KeyEvent k) {
if (k.getKeyCode() == KeyEvent.VK_UP) {
y -= 2;
} else if (k.getKeyCode() == KeyEvent.VK_DOWN) {
y += 2;
} else if (k.getKeyCode() == KeyEvent.VK_LEFT) {
x -= 2;
} else if (k.getKeyCode() == KeyEvent.VK_RIGHT) {
x += 2;
}

repaint();
}

public void keyReleased(KeyEvent k) {
}

public void keyTyped(KeyEvent k) {
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Draw d = new Draw();
JFrame f = new JFrame("Game");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setSize(800, 600);
f.setVisible(true);

f.add(d);
f.addKeyListener(d);
}
});
}
}

但更安全的是使用键绑定(bind)。

关于java - 我在 JFrame 中的重绘不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28157016/

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