AcionListener启动时,keyListener停止工作

时间:2015-10-06 15:41:18

标签: java swing jbutton keylistener

我在按下VK_ESCAPE时尝试调出密码对话框,它首先工作。但是只要按下任何JButton,焦点忽略keyListenrs就在这里我的代码是否有任何快速修复。

package AVAG;

/**
 *
 * @author allan walls
 */
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import static org.omg.CORBA.ORB.init;

public class avagui extends JFrame implements ActionListener, KeyListener {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    JComboBox comboBox;
    JButton app1, app2, app3, app4;
    //ImageIcon test1 =new ImageIcon(getClass().getResource("/images/Volunteering.jpg"));
    //websitelink link = new websitelink();
    GridLayout grid = new GridLayout(2, 2, -700, 0);

    Web1 web1 = new Web1();
    Web2 web2 = new Web2();
    Web3 web3 = new Web3();
    Web4 web4 = new Web4();
    JTextArea area = new JTextArea(6, 32);
       // keyboardgui kg = new keyboardgui();

    public avagui() {

        init();
        //setUndecorated(true);
    }

    private void init() {

        Container pane = this.getContentPane();
        this.requestFocusInWindow();
        pane.addKeyListener(this);
        pane.setFocusable(true);
        pane.setLayout(new GridLayout(2, 2, 4, 4));
        pane.setBackground(Color.black);
        ((JComponent) pane).setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));

        ImageIcon test1 = new ImageIcon(getClass().getResource("/images/Volunteering.jpg"));
        Image image = test1.getImage();

    // reduce by 50%
        image = image.getScaledInstance((int) (image.getWidth(null) / 1.18), (int) (image.getHeight(null) / 1.56), Image.SCALE_SMOOTH);

        test1.setImage(image);

   // JButton button = new JButton(test1);
        //pane.setBounds(0, 0, 200, 300);
        app1 = new JButton(test1);
        app1.setBackground(Color.BLACK);

        pane.add(app1);
        app1.addActionListener(this);
        ImageIcon test2 = new ImageIcon(getClass().getResource("/images/Aliss.jpg"));
        Image image2 = test2.getImage();
        image2 = image2.getScaledInstance((int) (image2.getWidth(null) / 1.18), (int) (image2.getHeight(null) / 1.56), Image.SCALE_SMOOTH);

        test2.setImage(image2);

        app2 = new JButton(test2);
        // 
        app2.setBackground(Color.BLACK);
        app2.addActionListener(this);
        pane.add(app2);

        ImageIcon test3 = new ImageIcon(getClass().getResource("/images/jobsearch.jpg"));
        Image image3 = test3.getImage();
        image3 = image3.getScaledInstance((int) (image3.getWidth(null) / 1.18), (int) (image3.getHeight(null) / 1.56), Image.SCALE_SMOOTH);

        test3.setImage(image3);
        app3 = new JButton(test3);
        app3.setBackground(Color.BLACK);
        app3.addActionListener(this);
        pane.add(app3);

        ImageIcon test4 = new ImageIcon(getClass().getResource("/images/Connect3.jpg"));
        Image image4 = test4.getImage();
        image4 = image4.getScaledInstance((int) (image4.getWidth(null) / 1.18), (int) (image4.getHeight(null) / 1.56), Image.SCALE_SMOOTH);

        test4.setImage(image4);
        app4 = new JButton(test4);
        app4.setBackground(Color.BLACK);
        app4.addActionListener(this);
        pane.add(app4);

    }

    public void shutdown() {
        System.exit(EXIT_ON_CLOSE);
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    /**
     *
     * @param e
     * @param k
     */
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

        if (e.getSource() == app1) {
            System.out.println("test1");
            web1.run();
        }

        if (e.getSource() == app2) {
            System.out.println("test2");
            web2.run();
        }
        if (e.getSource() == app3) {
            System.out.println("test3");
            web3.run();
        }
        if (e.getSource() == app4) {
            System.out.println("test4");
            web4.run();
        }

    }

    @Override
    public void keyPressed(KeyEvent e) {

        PasswordDialog pass = new PasswordDialog();
        System.out.println("works");
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {

            pass.run();

        }
    }

}

1 个答案:

答案 0 :(得分:4)

  

我在按下VK_ESCAPE时尝试调出密码对话框并且它首先工作。但是只要按下任何JButton,焦点就会忽略keyListenrs

确切地说,因为KeyEvents仅被调度到具有焦点的组件。因此,除非您想要将转义逻辑添加到所有组件,否则不应使用KeyListener。相反,你应该使用Key Bindings。

查看Escape Key and Dialog以获取一个示例,该示例显示如何通过向对话框的根窗格添加绑定来按下转义键时关闭对话框。

显然你的代码会有所不同,因为你想显示一个对话框,但是键绑定的概念是一样的,你只需要创建自定义Action。

注意:顺便说一下,我不确定使用转义键来显示对话框是使用的最佳关键笔划。通常,转义键用于关闭事物,如对话框或打开的组合框或弹出菜单。