单击按钮后 KeyListener 不起作用
KeyListener doesn't work after click Button
这是我的完整代码。它会帮助你理解。
我尝试在单击按钮或按下键盘时更改状态。当我按 ENTER 时,它会将 START 更改为 STOP(或 STOP 更改为 START)。当我点击按钮 START 状态更改为开始。当我点击停止按钮时,状态变为停止。我添加 System.out.println() 以检查我的代码是否正常工作。
第一次它工作正常。我可以通过按键盘 (ENTER) 来更改状态(我可以看到 "Now Start" 或 "Now Stop")
但是 KeyListener(ENTER) 在点击 Button 后不起作用。
我不知道为什么...请帮助我。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ServerClass3 extends JFrame
{
String SS = "Now Stop";
public ServerClass3()
{
JButton btn_start = new JButton("Start");
JButton btn_stop = new JButton("Stop");
JButton btn_quit = new JButton("quit");
btn_start.setLocation(20, 20);
btn_start.setSize(100, 40);
btn_stop.setLocation(140, 20);
btn_stop.setSize(100, 40);
btn_quit.setLocation(260, 20);
btn_quit.setSize(100, 40);
btn_start.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
SS = "Now Start";
System.out.println("ss is " + SS);
}
});
btn_stop.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
SS = "Now Stop";
System.out.println("ss is " + SS);
}
});
btn_quit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
SS = "quit";
System.out.println("ss is " + SS);
}
});
KeyPanel p = new KeyPanel();
setContentPane(p);
p.add(btn_start);
p.add(btn_stop);
p.add(btn_quit);
setSize(300, 300);
setVisible(true);
p.requestFocus();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class KeyPanel extends JPanel
{
public KeyPanel()
{
this.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
if (SS.equals("Now Stop"))
{
SS = "Now Start";
System.out.println(SS);
}
else
{
SS = "Now Stop";
System.out.println(SS);
}
}
}
});
}
}
public static void main(String[] args)
{
new ServerClass3();
}
}
发生这种情况是因为按下其中一个按钮后,焦点位于按钮上。因此,按钮会吸收所有事件并 none 进入您的 KeyPanel。你知道这是真的,因为当启动程序并按下空格键时,没有任何反应。但是只要你按下一个按钮,当按下空格键时,它就会执行这个按钮的 actionPerformed 事件。
要解决此问题,请使用 setFocusable 函数将所有按钮设置为不可聚焦:
button.setFocusable(false);
这样,无论您在 window 上单击什么或在哪里,按钮都不会获得焦点,并且所有事件都由 KeyPanel 注册。
这是我的完整代码。它会帮助你理解。
我尝试在单击按钮或按下键盘时更改状态。当我按 ENTER 时,它会将 START 更改为 STOP(或 STOP 更改为 START)。当我点击按钮 START 状态更改为开始。当我点击停止按钮时,状态变为停止。我添加 System.out.println() 以检查我的代码是否正常工作。
第一次它工作正常。我可以通过按键盘 (ENTER) 来更改状态(我可以看到 "Now Start" 或 "Now Stop")
但是 KeyListener(ENTER) 在点击 Button 后不起作用。
我不知道为什么...请帮助我。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ServerClass3 extends JFrame
{
String SS = "Now Stop";
public ServerClass3()
{
JButton btn_start = new JButton("Start");
JButton btn_stop = new JButton("Stop");
JButton btn_quit = new JButton("quit");
btn_start.setLocation(20, 20);
btn_start.setSize(100, 40);
btn_stop.setLocation(140, 20);
btn_stop.setSize(100, 40);
btn_quit.setLocation(260, 20);
btn_quit.setSize(100, 40);
btn_start.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
SS = "Now Start";
System.out.println("ss is " + SS);
}
});
btn_stop.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
SS = "Now Stop";
System.out.println("ss is " + SS);
}
});
btn_quit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
SS = "quit";
System.out.println("ss is " + SS);
}
});
KeyPanel p = new KeyPanel();
setContentPane(p);
p.add(btn_start);
p.add(btn_stop);
p.add(btn_quit);
setSize(300, 300);
setVisible(true);
p.requestFocus();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class KeyPanel extends JPanel
{
public KeyPanel()
{
this.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
if (SS.equals("Now Stop"))
{
SS = "Now Start";
System.out.println(SS);
}
else
{
SS = "Now Stop";
System.out.println(SS);
}
}
}
});
}
}
public static void main(String[] args)
{
new ServerClass3();
}
}
发生这种情况是因为按下其中一个按钮后,焦点位于按钮上。因此,按钮会吸收所有事件并 none 进入您的 KeyPanel。你知道这是真的,因为当启动程序并按下空格键时,没有任何反应。但是只要你按下一个按钮,当按下空格键时,它就会执行这个按钮的 actionPerformed 事件。
要解决此问题,请使用 setFocusable 函数将所有按钮设置为不可聚焦:
button.setFocusable(false);
这样,无论您在 window 上单击什么或在哪里,按钮都不会获得焦点,并且所有事件都由 KeyPanel 注册。