gpt4 book ai didi

单独类中的 Java KeyListener

转载 作者:行者123 更新时间:2023-11-30 05:57:50 25 4
gpt4 key购买 nike

所以我在这里有我的主类,基本上创建一个新的 jframe 并向它添加一个世界对象。世界对象基本上是所有绘图和键盘监听发生的地方......

public class Blobs extends JFrame{

public Blobs() {
super("Blobs :) - By Chris Tanaka");
setVisible(true);
setResizable(false);
setSize(1000, 1000);
setIgnoreRepaint(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(new World());
}

public static void main(String[] args) {
new Blobs();
}
}

您如何准确地从世界级获得关键输入?(到目前为止,我的世界类扩展了一个 jpanel 并实现了一个 keylistener。在构造函数中我添加了 KeyListener(this)。我也有这些方法,因为它们是自动实现的:

public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W)
System.out.println("Hi");
}

public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}

但是这似乎不起作用?

最佳答案

如果您想通知“观察类”您的世界类中发生了 KeyPress 事件,那么现在是使用观察者的好时机。结构像这样:

public interface Observer
{
public void update(KeyEvent keyEvent);
}

public interface Observable
{
public void NotifyObservers(KeyEvent keyEvent);
}

public class World implements KeyListener, Observable
{
private ArrayList<Observer> obsList;

public World()
{
obsList = new ArrayList();
}

public void keyPressed(KeyEvent e)
{
NotifyObservers(e);
}

public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}

public void NotifyObservers(KeyEvent keyEvent)
{
for(Observer obs : obsList)
{
obs.update(keyEvent);
}
}

public void AddObserver(Observer obs)
{
if (obs != null)
obsList.add(obs);
}

public void DelObserver(Observer obs)
{
if (obs != null)
obsList.remove(obs);
}
}

public class Blobs extends JFrame implements Observer
{

public Blobs()
{
super("Blobs :) - By Chris Tanaka");

//Register this instance of Blobs as an observer that is stored in the World's
//obsList ArrayList field
World world = new World();
world.addObserver(this);

setResizable(false);
setSize(1000, 1000);
setIgnoreRepaint(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(world);
this.addKeyListener(world);
setVisible(true);
}

public static void main(String[] args) {
new Blobs();
}

public void update(KeyEvent keyEvent)
{
//do whatever here when key event occurs
}
}

所以这里的最终结果是,您可以使任何实现我定义的 obsList 的 Observer 接口(interface)部分的类。然后当一个键事件发生时,它将调用 NotifyObservers() 方法,该方法遍历列表并调用 Observing 类中的 update() 方法。

编辑:

如果您愿意,您可以让 World 和 Battle 类以它们自己的方式处理关键事件。

public class Battle implements Observer
{

public void update(KeyEvent e)
{
// do processing here
}
}

public class Blobs implements Observer
{
public void update(KeyEvent e)
{
// do processing here
}
}

你只需要在某个时候像我在 Blobs 中那样将战斗作为观察者添加到你的世界类中

worldInstance.addObserver(new Battle());

此外,如果你想使用标志只允许某些类处理按键事件,那么你可以简单地更新接口(interface)以允许将标志传递给更新方法,如下所示:

public interface Observer
{
public void update(object isFor, KeyEvent e);
}

然后你的 Observer 更新方法会有这样的流程:

public class Battle 
{
public void update(object flag, KeyEvent e)
{
if (flag instanceof Battle)
{
//now do your work
}
}
}

这也意味着更新 Observable 接口(interface)和实现器中的通知方法

关于单独类中的 Java KeyListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5131547/

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