import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Menu{
JFrame frame = new JFrame();
Image icon = Toolkit.getDefaultToolkit().getImage("image1.png");
Action escapePressed;
public Menu() {
frame.setVisible(true);
frame.setIconImage(icon);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(new Dimension(500, 500));
frame.setTitle("Nine Games");
frame.setFocusable(true);
frame.setResizable(true);
frame.add(new StartScreen());
escapePressed = new EscapePressed();
frame.getInputMap().put(KeyStroke.getKeyStroke('w'), "escapePressed");
frame.getActionMap().put("escapePressed", escapePressed);
}
public class EscapePressed extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Escape Pressed");
System.exit(0);
}
}
}
我不知道為什么,但是這個程式這么說getInputMap并且getActionMap不存在。這很奇怪。我可以發誓我把它都正確地放進去了。我什至遵循了一個教程,但似乎沒有任何效果。
uj5u.com熱心網友回復:
幾個問題:
- JFrame 沒有 InputMap 和 ActionMap。只有從 JComponent 擴展的組件才能使用鍵系結。因此,要處理退出 KeyStroke,您可能希望使用
JRootPane添加系結 - 您不想使用默認的
WHEN_FOCUSEDInputMap,因為根窗格將沒有焦點,因為您添加到框架的其他一些組件將具有焦點。相反,您想使用WHEN_IN_FOCUSED_WINDOWInputMap。
所以你的代碼可能是這樣的:
//frame.getInputMap().put(KeyStroke.getKeyStroke('w'), "escapePressed");
//frame.getActionMap().put("escapePressed", escapePressed);
frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('w'), "escapePressed");
frame.getRootPane().getActionMap().put("escapePressed", escapePressed);
閱讀 Swing 教程中有關如何使用鍵系結的部分以獲取更多資訊。
另請查看使用頂級容器以獲取有關根窗格的更多資訊。
uj5u.com熱心網友回復:
我不喜歡使用KeyStroke.getKeyStroke,因為在如何觸發擊鍵方面存在一定程度的模糊性,這是個人的事情,但我已經浪費了太多時間來嘗試除錯與之相關的問題。
相反,我更喜歡使用KeyStroke.getKeyStroke(KeyEvent.VK_W, 0)。這(對我來說)更容易理解,我也可以通過它配置“按下”或“釋放”功能。
的默認行為getInputMap()是生成事件WHEN_FOCUSED,這與您期望的相同KeyListener,但是您將鍵系結添加到JFrame,這不太可能獲得焦點(它是一個復合組件,因此沒有意義這樣做)。
相反,您應該嘗試類似...
frame.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "escapePressed");
frame.getActionMap().put("escapePressed", escapePressed);
現在,就我個人而言,我認為這種事情可能最好通過一個組件來維護,該組件被添加到框架中,但這就是我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450064.html
