gpt4 book ai didi

java - 使用键盘向下键在 Jpanel 上移动 BALL

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

我有一个类 mypanel 从 jpanel 扩展而来,我在其中使用图形并制作球。第二类是 Main,我在其中制作 JFrame 并将面板添加到框架。 Main 中还有另一个类 MKeyListener,它从我处理键盘事件的 KeyAdapter 类扩展而来。我在 Main 类中创建了一个 Jpanel 类的对象,并在 jpanel 类中注册了 MkeyListener 类。现在我想用向下键盘键在 jpanel 上向下移动球,但球不会用向下键向下移动,这是我程序的代码。

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

class mypanel extends JPanel{
int n=0;
int m=0;
int i=170;
int j=340;
int a=60;
int b=20;
public void paintComponent (Graphics g){
super.paintComponent(g);
Graphics2D g2= (Graphics2D)g;
g2.setColor(Color.green);
g2.fillOval(n,m,10,10);
}
}

public class Main {
JFrame frame;
mypanel p;
int x,y;
public Main (){
x=0;
y=0;
frame=new JFrame();
Container c = frame.getContentPane();
c.setLayout(new BorderLayout());
p = new mypanel();
c.add(p,BorderLayout.CENTER);
frame.setSize(400,400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MKeyListener k=new MKeyListener();
p.addKeyListener(k);

}

public static void main(String args []) {
Main a= new Main();
}


class MKeyListener extends KeyAdapter {

public void keyPressed(KeyEvent event) {

if (event.getKeyCode()==KeyEvent.VK_DOWN ) {
x =x+4;
y=y+4;
p.n+=x;
p.m+=y;
p.repaint();
System.out.println("success");
}
}
}

}

最佳答案

KeyListener 是挑剔的,它注册到的组件必须具有焦点并且在触发键事件之前是可聚焦的。它也可以被任何其他可聚焦组件覆盖,这可能是好事也可能是坏事。

通常建议改用键绑定(bind) API,这样您可以控制触发事件所需的焦点级别。它的配置和重用性通常也更加灵活

参见 How to Use Key Bindings了解更多详情

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

public static void main(String args[]) {
Main a = new Main();
}

public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MyPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class MyPanel extends JPanel {

private int n = 0;
private int m = 0;
private int i = 170;
private int j = 340;
private int a = 60;
private int b = 20;

public MyPanel() {
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Action.down");
am.put("Action.down", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
n += 4;
m += 4;
repaint();
}
});
}

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

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.green);
g2.fillOval(n, m, 10, 10);
}
}

}

作为一般性建议,将对象的字段公开为 publicpackage-private 通常不是一个好主意,您会失去对那里管理的控制,这意味着它们可以在您不知情或无法控制的情况下从任何地方进行修改。

更好地 self 包含这些值的管理(在内部或通过使用 getter)或通过模型- Controller 范例

关于java - 使用键盘向下键在 Jpanel 上移动 BALL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237983/

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