簡體   English   中英

在JFrame中進行關鍵事件

[英]Making a keyevent in a JFrame

我試圖做一個關鍵使JFrame中發生的事情。 現在,我只是想在按左鍵時禁用按鈕,但沒有任何反應。 我以為我沒事,但是什么也沒做。

編輯:我注意到當我不單擊開始時,它可以工作。 但是,按開始后,它不會響應。

到目前為止,這是我的代碼:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;



public class MyFrame extends JFrame implements ActionListener, KeyListener
{
private static final long serialVersionUID = 1L;
private JPanel p1;
private JButton b1, b2;
private JLabel lb1;
private int a;
private Font font = new Font("Arial", Font.BOLD, 20);


public MyFrame()
{
    setLayout(new FlowLayout());
    setSize(700,600);
    setVisible(true);
    setResizable(false);
    addKeyListener(this);
    setFocusable(true);

    p1 = new JPanel(); add(p1);
    p1.setBackground(Color.BLACK);
    p1.setPreferredSize(new Dimension(650,500));
    p1.setFocusable(true);
    b1 = new JButton("Start"); add(b1);
    b1.addActionListener(this);
    b2 = new JButton("Test"); add(b2);
    b2.setFocusable(true);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent event)
{
    Graphics g = p1.getGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(30, 210, 10, 70);
    g.fillRect(620, 210, 10, 70);
    for(int i=0; i<7; i++)
    {
        g.fillRect(325, a, 10, 70);
        a += 90;
    }
    g.setFont(font);
    g.drawString("Player 1: ", 120, 20);
    g.drawString("Player 2: ", 450, 20);
}

public void keyPressed(KeyEvent e) 
{
    int d = e.getKeyCode();
    if(d==KeyEvent.VK_LEFT)
    {
        b2.setEnabled(false);
    }
}

public void keyReleased(KeyEvent e) 
{


}

public void keyTyped(KeyEvent e) 
{


}

}

這是我的Main.java文件:

public class Main { 
public static void main(String[] arg)
{
    MyFrame mf = new MyFrame();
}

}

關於焦點(除了其他方面), KeyListener存在很多問題。 使用Swing時,最好使用Key Bindings ,它使我們可以更好地控制焦點選項。 WHEN_FOCUSEDWHEN_ANCESTOR_OF_FOCUSED_COMPONENTWHEN_IN_FOCUSED_WINDOW有不同的InputMap 他們的名字幾乎是在自我記錄。 所以如果我們要做

JPanel panel = (JPanel)frame.getContentPane();
InputMap imap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

那么我們就獲得了框架聚焦時的InputMap 然后,我們將具有ActionKeyStroke綁定到該InputMap和組件的ActionMap 例如

JPanel panel = (JPanel)frame.getContentPane();
InputMap imap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap.put(KeyStroke.getKeyStroke("LEFT"), "leftAction");
ActionMap amap = panel.getActionMap();
Action leftAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        doSomethingWhenLeftIsPressed();
    }
};
amap.put("leftAction", leftAction);

資源資源

您忘了告訴JFrame它應該使用以下代碼行監聽鍵: addKeyListener(this);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM