我试图让密钥在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();
}
}
答案 0 :(得分:3)
KeyListener
在关注(除其他事项外)方面存在很多问题。使用Swing时,最好使用Key Bindings,这样可以更好地控制焦点选项。 InputMap
,WHEN_FOCUSED
,WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
有WHEN_IN_FOCUSED_WINDOW
个不同的JPanel panel = (JPanel)frame.getContentPane();
InputMap imap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
个。他们的名字几乎都是自我记录的。所以如果我们要做的话
InputMap
然后我们得到了KeyStroke
,当帧聚焦时。然后,我们会将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);
和组件的{{1}}。例如
{{1}}
<强>资源强>
答案 1 :(得分:1)
你忘了告诉JFrame它应该用这行代码来监听密钥:addKeyListener(this);