当AcionListener启动时,keyListener停止工作

问题描述:

当VK_ESCAPE被按下并且它首先工作时,我试图调出密码对话框。但只要任何JButtons被按下焦点忽略keyListenrs在这里是我的代码是否有任何快速修复此。当AcionListener启动时,keyListener停止工作

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(); 

     } 
    } 

} 
+2

你有我们无法测试的代码,比如Web?类。我们不想看到你所有的代码,但[mcve]对你和我们都会很好。除此之外,您将希望使用键绑定而不是关键侦听器(因为大多数本网站上类似问题的答案都会告诉您)。 –

+0

无法显示剩余的类,因为它们太大,而且我正在为组织开发此代码。对不起 – user3188481

+1

同样,我明确没有要求其余的类,只是你的[mcve]。是的,这将需要你的工作,但它会让我们能够回答你的问题。再次尝试使用Key Bindings,如果这不起作用,那么用你的[mcve]改善你的问题。 –

我想当按下VK_ESCAPE弹出密码对话框,它工作在第一。但只要任何JButtons被按下焦点忽略密钥的持有人

确切地说,因为KeyEvents只调度到焦点组件。所以除非你想把你的转义逻辑添加到你的所有组件中,否则你不应该使用KeyListener。相反,你应该使用密钥绑定。

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

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

注意:顺便说一下,我不确定使用换码键显示对话框的使用是最好的关键笔画。通常,退出键用于关闭对话框,如对话框或打开组合框或弹出式菜单。

+0

感谢使用退出键的原因是为了调出密码输入对话框,然后如果输入正确显示应用程序顶部的退出栏。它只是一个安全功能,可以阻止ysers远离应用程序,因为它将被一般公众用来搜索作业,并且福利有帮助 – user3188481

+0

@ user3188481,所以问题就回答了。有关逃生钥匙的说明与答案无关。 – camickr