Tôi gặp sự cố khi nhận được KeyBoardFocusManger
để làm việc với toàn màn hình Window
. Không có vấn đề gì, nó chỉ sẽ không nhận được đầu vào bàn phím. Tôi đã sử dụng một số System.exit(0)
và một số println()
để tìm kiếm bất kỳ lệnh gọi nào đến phương thức nhấn/phát hành/đã nhập, nhưng không có lỗi nào được ném. Tôi đã thử KeyListeners
; nhưng sau khi đọc this, tôi đã đổi thành KeyboardFocusManager
và điều tương tự vẫn xảy ra. Tôi thực sự đang tuyệt vọng; từ những gì tôi có thể đánh giá, các Window
không nhận được trọng tâm của bàn phím?Cửa sổ toàn màn hình sẽ không nhận được đầu vào bàn phím bằng cách sử dụng KeyListener hoặc KeyBoardFocusManager
Đây là của tôi chính:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// Determine if full-screen mode is supported directly
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if (gs.isFullScreenSupported()) {
Frame frame = new Frame(gs.getDefaultConfiguration());
SpaceInvaderUI spaceInvaderUI = new SpaceInvaderUI(frame);
// Enter full-screen mode
gs.setFullScreenWindow(spaceInvaderUI);
} else {
JOptionPane.showMessageDialog(null, "Does not support full screen!", "Error 0x01", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
});
}
và đây là giao diện người dùng, trong đó có các KeyBoardFocusManger
, và được thêm vào trong addListeners()
phương pháp:
class SpaceInvaderUI extends Window {
private JPanel drawingPanel;
private Image background;
private JButton btnExit;
public SpaceInvaderUI(Frame frame) {
super(frame);
try {
background = ImageIO.read(getClass().getResourceAsStream("background.png"));
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Could not extract resource: " + ex.getMessage(), "Error 0x02", JOptionPane.ERROR_MESSAGE);
System.exit(2);
}
createWindow();
}
private void createComponents() throws HeadlessException {
drawingPanel = new DrawingPanel(background, this);
btnExit = new JButton("Exit");
}
private void createWindow() {
createComponents();
addListeners();
addComponentsToWindow();
}
private void addComponentsToWindow() {
add(drawingPanel, BorderLayout.CENTER);
add(btnExit, BorderLayout.SOUTH);
}
private void addListeners() {
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new MyDispatcher());
btnExit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
}
private class MyDispatcher implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
System.out.println("pressed");
System.exit(0);
} else if (e.getID() == KeyEvent.KEY_RELEASED) {
System.out.println("released");
System.exit(0);
} else if (e.getID() == KeyEvent.KEY_TYPED) {
System.out.println("Typed");
System.exit(0);
}
return false;
}
}
}
Nút thoát là chỉ vì tôi đã mệt mỏi của giết chết ứng dụng của tôi thông qua taskmanager. Cuối cùng, đây là bảng điều khiển của tôi mà trò chơi sẽ diễn ra và nền của tôi được vẽ trên:
public class DrawingPanel extends JPanel {
private final Image background;
private final SpaceInvaderUI invaderUI;
DrawingPanel(Image background, SpaceInvaderUI invaderUI) {
this.background = background;
this.invaderUI = invaderUI;
}
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
grphcs.drawImage(background.getScaledInstance((int) invaderUI.getWidth(), (int) invaderUI.getHeight(), Image.SCALE_SMOOTH), 0, 0, this);
}
}
Cảm ơn bạn trước.
EDIT: Bây giờ tôi đã cố gắng sử dụng một keybinding trên tôi drawingPanel
nhưng vẫn không có gì xảy ra khi tôi nhấn f2:
class SpaceInvaderUI extends Window {
private JPanel drawingPanel;
private Image background;
private JButton btnExit;
public SpaceInvaderUI(Frame frame) {
super(frame);
try {
background = ImageIO.read(getClass().getResourceAsStream("background.png"));
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Could not extract resource: " + ex.getMessage(), "Error 0x02", JOptionPane.ERROR_MESSAGE);
System.exit(2);
}
createWindow();
}
private void createComponents() throws HeadlessException {
drawingPanel = new DrawingPanel(background, this);
btnExit = new JButton("Exit");
}
private void createWindow() {
createComponents();
addListeners();
addComponentsToWindow();
}
private void addComponentsToWindow() {
add(drawingPanel, BorderLayout.CENTER);
add(btnExit, BorderLayout.SOUTH);
}
private void addListeners() {
Action exit = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
drawingPanel.getInputMap().put(KeyStroke.getKeyStroke("F2"),
exit);
btnExit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
}
}
Nó không phải là khung mà là cửa sổ và tôi có thể sử dụng nút để đóng cửa sổ nhưng tôi muốn trò chơi sử dụng phím 'Esc' để thoát và xuất hiện menu etc –
Sau đó, tôi đoán KeyBinding chính xác là những gì có thể hoạt động bạn. –