在swing学习中,发现同时添加面板监听和按钮监听时,面板监听会失效。学习查证后发现是面板无法获得焦点关系。
处理方法:
1.在setVisible(true)方法前面加setFocusable(true),默认面板为焦点。
2.在按钮监听方法后添加requestFocus()方法,在每次执行完按钮点击后将面板设为焦点。
代码如下:
package swing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class TestGUI {
public static void main(String[] args) {
//创建窗口
JFrame jf = new JFrame();
jf.setSize(400, 300);
jf.setLocation(580, 200);
// 主窗体中的组件设置为绝对定位
jf.setLayout(null);
final JLabel l = new JLabel();
ImageIcon i = new ImageIcon("img\\home.png");
l.setIcon(i);
l.setBounds(50, 50, i.getIconWidth(), i.getIconHeight());
JButton b = new JButton("隐藏图片");
b.setBounds(150, 200, 100, 30);
//给按钮增监听
b.addActionListener(new ActionListener() {
boolean flag = false;
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
l.setVisible(flag);
if (flag == false)
b.setText("显示图片");
if (flag == true)
b.setText("隐藏图片");
flag = !flag;
jf.requestFocus();
}
});
jf.addKeyListener(new KeyListener() {
// 键被弹起
public void keyReleased(KeyEvent e) {
System.out.println(e.getKeyCode());
}
// 键被按下
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
// 一个按下弹起的组合动作
public void keyTyped(KeyEvent e) {
}
});
jf.add(l);
jf.add(b);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setFocusable(true);
jf.setVisible(true);
}
}