here is my code, i basically just did a tester for the most common listeners, which i might later use in future projects, the main problem is in the keylistener at the bottom, i am trying to re-show the frame but i think it just cant be done that way, please help ps: no idea why the imports dont show up right.
package newpackage;
import java.awt.Color;
impor开发者_如何学Pythont 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){}
}
}
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 a KeyListener
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
- Sun Tutorial, how to use the System Tray
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.
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"
精彩评论