是否可以使用按键侦听器显示以前隐藏的 JFrame
这是我的代码,我基本上只是为最常见的侦听器做了一个测试器,我稍后可能会在未来的项目中使用它,主要问题是在底部的关键侦听器中,我正在尝试重新显示框架,但我认为它只是不能那样做,请帮忙 ps:不知道为什么导入没有正确显示。
package newpackage;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JSeparator;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class NewClass1 extends JFrame {
private JLabel item1,infomouse,infoclicks,infoKeys,writehere;
private JButton button1,button2,button3;
private JTextArea text1,status,KeyStatus;
private JTextField text2,text3,mouse,clicks,test;
private JSeparator sep1;
private int clicknumber;
public NewClass1() {
super("Listener Tests");
setLayout(null);
sep1 = new JSeparator();
button1 = new JButton("Button1");
button2 = new JButton("Button2");
button3 = new JButton("Button3");
item1 = new JLabel("Button Status :");
infomouse = new JLabel("Mouse Status :");
infoclicks = new JLabel("Nº of clicks :");
infoKeys = new JLabel("Keyboard status:");
writehere = new JLabel("Write here: ");
text1 = new JTextArea();
text2 = new JTextField(20);
text3 = new JTextField(20);
status = new JTextArea();
mouse = new JTextField(20);
clicks = new JTextField(4);
KeyStatus = new JTextArea();
test = new JTextField(3);
clicks.setText(String.valueOf(clicknumber));
text1.setEditable(true);
text2.setEditable(false);
text3.setEditable(false);
status.setEditable(false);
mouse.setEditable(false);
clicks.setEditable(false);
KeyStatus.setEditable(false);
text1.setBounds(135, 310, 150, 20);
text2.setBounds(135, 330, 150, 20);
text3.setBounds(135, 350, 150, 20);
status.setBounds(15, 20, 240, 20);
infomouse.setBounds(5,45,120,20);
infoKeys.setBounds(5,90,120,20);
KeyStatus.setBounds(15,115,240,85);
test.setBounds(15,225,240,20);
mouse.setBounds(15,70,100,20);
infoclicks.setBounds(195, 45, 140, 20);
clicks.setBounds(195, 70, 60, 20);
item1.setBounds(5, 0, 120, 20);
button1.setBounds(10, 310, 115, 20);
button2.setBounds(10, 330, 115, 20);
button3.setBounds(10, 350, 115, 20);
sep1.setBounds(5, 305, 285, 10);
sep1.setBackground(Color.BLACK);
status.setBackground(Color.LIGHT_GRAY);
button1.addActionListener(new button1list());
button2.addActionListener(new button1list());
button3.addActionListener(new button1list());
button1.addMouseListener(new MouseList());
button2.addMouseListener(new MouseList());
button3.addMouseListener(new MouseList());
getContentPane().addMouseListener(new MouseList());
test.addKeyListener(new KeyList());
this.addKeyListener(new KeyList());
test.requestFocus();
add(item1);
add(button1);
add(button2);
add(button3);
add(text1);
add(text2);
add(text3);
add(status);
add(infomouse);
add(mouse);
add(infoclicks);
add(clicks);
add(infoKeys);
add(KeyStatus);
add(test);
add(sep1);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch (Exception e){System.out.println("Error");}
SwingUtilities.updateComponentTreeUI(this);
setSize(300, 400);
setResizable(false);
setVisible(true);
test.setFocusable(true);
test.setFocusTraversalKeysEnabled(false);
setLocationRelativeTo(null);
}
public class button1list implements ActionListener {
public void actionPerformed(ActionEvent e) {
String buttonpressed = e.getActionCommand();
if (buttonpressed.equals("Button1")) {
text1.setText("just");
} else if (buttonpressed.equals("Button2")) {
text2.setText(text2.getText()+"testing ");
} else if (buttonpressed.equals("Button3")) {
text3.setText("this");
}
}
}
public class MouseList implements MouseListener{
public void mouseEntered(MouseEvent e){
if(e.getSource()==button1){
status.setText("button 1 hovered");
}
else if(e.getSource()==button2){
status.setText("button 2 hovered");
}
else if(e.getSource()==button3){
status.setText("button 3 hovered");
}
}
public void mouseExited(MouseEvent e){
status.setText("");
}
public void mouseReleased(MouseEvent e){
if(!status.getText().equals("")){
status.replaceRange("", 0, 22);
}
}
public void mousePressed(MouseEvent e){
if(e.getSource()==button1){
status.setText("button 1 being pressed");
}
else if(e.getSource()==button2){
status.setText("button 2 being pressed");
}
else if(e.getSource()==button3){
status.setText("button 3 being pressed");
}
}
public void mouseClicked(MouseEvent e){
clicknumber++;
mouse.setText("mouse working");
clicks.setText(String.valueOf(clicknumber));
}
}
public class KeyList implements KeyListener{
public void keyReleased(KeyEvent e){}
public void keyPressed(KeyEvent e){
KeyStatus.setText("");
test.setText("");
String full = e.paramString();
String [] temp = null;
temp = full.split(",");
for(int i=0; i<7 ;i++){
KeyStatus.append(temp[i] + "\n");
}
if(e.getKeyChar()=='h'){setVisible(false);
test.requestFocus();
}
if(e.getKeyChar()=='s'){setVisible(true);}
}
public void keyTyped(KeyEvent e){}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
可见组件可以拥有键盘焦点,并接收键盘和其他输入事件,但不可见组件不能拥有焦点,也不能接收输入事件。当您使框架不可见时,它会停止接收输入事件,它的所有子组件也会停止接收输入事件,包括您要添加
KeyListener
的test
组件。要实现此功能,您必须有一个可见组件,并将键盘事件从该组件转发到不可见框架。或者更好的是,从已经可见的组件中调用
invisibelFrame.setVisible(true)
。或者,您也许可以找到其他方式来触发显示框架。例如,带有上下文菜单的系统托盘组件是隐藏和显示应用程序框架的常见模式(对于某些用户来说,在此过程中会引起很多烦恼!)
请参阅
Visible components can have the keyboard focus, and recieve keyboard and other input events, but invisible components cannot have the focus, nor recieve input events. When you make the frame invisible, it stops recieving input events, as does all it's children, including the
test
component you are adding aKeyListener
to.To make this work, you will have to have a visible component, and forward keyboard events from that to your invisible frame. Or better, call
invisibelFrame.setVisible(true)
from your already visible component.Alternatively, you may be able to find some other way to trigger showing the frame. For example, a system tray component, with a context menu is a common pattern for hiding and showing application frames (and for some users, causing much chagrin in the process!)
See
作为一般规则,您不应该使用 KeyListener。当只有 AWT 存在时,这是旧的做事方式。
使用 Swing 时,您应该使用按键绑定。绑定无法解决不可见组件和框架的问题,但这是所有 Swing 组件使用的方法。
As a general rule you should NOT be using a KeyListener. That was the old way of doing things when only AWT was around.
When using Swing you should be using Key Bindings. The binding won't solve your problem with invisible components and frames but this is approach all Swing component use.
是的,这是可能的,但您需要将外部 java 库与本机库一起使用。搜索“JIntellitype”。但这仅适用于 Windows。如果您想在 Linux 上使用此功能,请使用“JXGrabKey”
Yes it is possible but you will need to use a external java library with a native library. Search for "JIntellitype". But this will only work on Windows. If you want to use this functionality on linux, use "JXGrabKey"