javaapplet游戏设计:键盘焦点

zed5wv10  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(371)

我把这个贴错地方了( GameDev )却没有得到回应。所以我在这里再贴一次。
我正在制作一个小程序游戏,它正在渲染,游戏循环正在运行,动画正在更新,但键盘输入不起作用。这是一个sscce。

public class Game extends JApplet implements Runnable {

    public void init(){
        // Initialize the game when called by browser
        setFocusable(true);
        requestFocus();
        requestFocusInWindow();  // Always returning false
        GInput.install(this);    // Install the input manager for this class
        new Thread(this).start();
    }

    public void run(){
        startGameLoop();
    }

}

这是金普特班。

public class GInput implements KeyListener {

    public static void install(Component c){
        new GInput(c);
    }

    public GInput(Component c){
        c.addKeyListener(this);
    }

    public void keyPressed(KeyEvent e){
        System.out.println("A key has been pressed");
    }

    ......

}

这是我的金普特班。当作为applet运行时,它不工作,当我将game类添加到一个框架时,它工作正常。
谢谢
现在解决了。查看我的解决方案

alen0pnh

alen0pnh1#

现在我有两个选择,
使用jws
不创建小程序模式
现在我试着编一个新的班级叫 GApplet . 它将一个游戏加载到一个新的jframe中,这个jframe在applet中工作。现在我也可以从网上进入全屏模式了。这里有一个班级的链接。
这个 GApplet
现在它像webstart一样工作,实际上是一个applet。

rvpgvaaj

rvpgvaaj2#

如果在浏览器中运行,可能需要单击小程序以使其具有焦点。出于安全原因,大多数浏览器不会让applet在用户没有点击的情况下就抓住键盘焦点。
因此,我将添加一个鼠标侦听器,而不是直接在 init() :

addMouseListener(new MouseAdapter() {
   public void onMousePress(MouseEvent e) {
      requestFocus();
   }
});
zdwk9cvp

zdwk9cvp3#

一个可能的解决方案是使用japplet的contentpane,将焦点放在它而不是japplet本身上。但我更喜欢使用键绑定。您可能需要使用摆动计时器才能工作:
我的sscce:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;

@SuppressWarnings("serial")
public class AppletKeyListen extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               setFocusable(true);

               int timerDelay = 100;
               Timer myTimer = new Timer(timerDelay , new ActionListener() {

                  @Override
                  public void actionPerformed(ActionEvent arg0) {
                     boolean focusObtained = requestFocusInWindow();
                     System.out.println("focusObtained for JApplet: " + focusObtained);

                     Container contentPane = getContentPane();
                     contentPane.setFocusable(true);

                     focusObtained = contentPane.requestFocusInWindow();
                     System.out.println("focusObtained for contentPane: " + focusObtained);

                  }
               });
               myTimer.setRepeats(false);
               myTimer.start();
//               boolean focusObtained = requestFocusInWindow();
//               System.out.println("focusObtained: " + focusObtained);
//               
//               Container contentPane = getContentPane();
//               contentPane.setFocusable(true);
//               
//               focusObtained = contentPane.requestFocusInWindow();
//               System.out.println("focusObtained: " + focusObtained);

            }
         });
      } catch (InvocationTargetException | InterruptedException e) {
         e.printStackTrace();
      }
   }
}

相关问题