【问题标题】:Making a keyevent in a JFrame在 JFrame 中制作 keyevent
【发布时间】:2014-10-29 08:47:54
【问题描述】:

我正在尝试在 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();
}

}

【问题讨论】:

    标签: java swing jframe keylistener


    【解决方案1】:

    KeyListener 有很多问题,关于焦点(除其他外)。对于 Swing,最好使用Key Bindings,这让我们可以更好地控制焦点选项。 WHEN_FOCUSEDWHEN_ANCESTOR_OF_FOCUSED_COMPONENTWHEN_IN_FOCUSED_WINDOW 有不同的 InputMaps。他们的名字几乎是自我记录的。所以如果我们这样做

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

    然后我们得到InputMap 用于当框架聚焦时。然后我们将KeyStrokeAction 绑定到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);
    

    资源

    【讨论】:

      【解决方案2】:

      你忘了告诉 JFrame 它应该用这行代码监听键:addKeyListener(this);

      【讨论】:

      • 现在为我工作,但单击开始后不会响应。发生了什么事?
      • 那是焦点问题,当你点击开始按钮时,你正在改变面板,从而改变了应用程序的焦点,将这一行添加到actionPerformed方法的末尾,这样frame重新获得焦点:requestFocus();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 2012-02-16
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多