2010-12-04 120 views
0

我有一个默认按钮设置为btnClose_(关闭按钮:此按钮关闭窗口)的Jframe应用程序。 我有2个文本框,当用户单击文本框上的Enter键时也必须触发一个事件。会发生什么情况是,当光标位于文本字段上时,如果按Enter键,则关闭按钮上的事件将被触发,导致窗口关闭。在java中删除defaultButton的监听器

如果在文本字段上按下Enter键,是否可以删除默认按钮的侦听器?这是我的文本框听者

/** 
* Receives the two textfield instance 
*/ 
private void addFilterListener(JTextField txf) { 
    txf.addKeyListener(new KeyAdapter() { 
     /** 
     * Invoked when a key has been pressed. 
     */ 
     public void keyPressed(KeyEvent e) {    
      if (e.getKeyCode() == KeyEvent.VK_ENTER) { 
       ActionListener al = btnClose_.getActionListeners()[0]; 
       btnClose_.removeActionListener(al); 
       btnFilter_.doClick(); 
       e.consume(); 
       btnClose_.addActionListener(al); 
      } 
     } 
    }); 
} 
private JButton getBtnClose(){ 
if(btnClose == null){ 
    btnClose.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      getWindow().dispose(); 
     } 

    }); 
} 
return btnClose; 

}

}

+0

`会发生什么情况是当光标在文本框上时按下Enter键时,关闭按钮上的事件被触发,导致窗口关闭。您正在调用按钮单击文本框的Enter键火灾事件, – 2010-12-04 10:01:53

+0

嗯,对于问题的描述不清楚抱歉。文本框应该听取Enter键。但是因为有一个默认按钮,即btnClose_,窗口关闭。顺便说一下,当用户按下两个文本框上的Enter键时,必须点击btnFilter_ – doku 2010-12-04 10:08:56

回答

1

据我理解你的问题,你想,如果按下回车键buttonClick应该不会被解雇的代码。

如果按下

if (e.getKeyCode() != KeyEvent.VK_ENTER) { 
       btnFilter_.doClick(); 
} 
0

请在关闭按钮的的ActionListener这将不会触发doClick(),假设你可以改变它的代码,请勿靠近,如果文本字段中有焦点。

 public void actionPerformed(ActionEvent e) { 
      if (field1.hasFocus() || field2.hasFocus()) 
       return; // don't close if text field has focus 
      frame.dispose(); 
     } 

如果你不能改变的关闭按钮的ActionListener的,一个的FocusListener添加到文本字段。如果其中一个获得焦点,请删除默认按钮。如果文本字段丢失了焦点,请重置默认按钮。

FocusAdapter listener = new FocusAdapter() { 
     @Override 
     public void focusGained(FocusEvent e) { 
      frame.getRootPane().setDefaultButton(null); 
     } 
     @Override 
     public void focusLost(FocusEvent e) { 
      frame.getRootPane().setDefaultButton(close); 
     } 
    }; 
    field1.addFocusListener(listener); 
    field2.addFocusListener(listener); 

这应该是比这取决于听众被称为以正确的顺序更好 - 它是没有用的,除去监听器,如果它已经叫...

2

在哪里开始?

对我产生的第一件事是坏的变量名称。 txf?什么是错误的适当的话?说,textFieldfield。或者更好一些,描述其目的的名称,而不是它的名称。其次,第一个评论是错误的(并不少见),第二个评论是多余的(在KeyListener界面中已经指定,你不需要再试一次,半心半意地指定它)。

接下来,低级别的关键侦听器往往不能很好地在Swing组件上工作(JComboBox是最臭名昭着的示例 - 它通常是用子组件实现的)。一般来说,您可以使用JComponent.registerKeyboardAction(API文档说这已过时但不被弃用,并使用更详细的代码)。对于文本组件,您通常需要使用文档(通常通过DocumentFilter)。在这种特殊情况下,看起来你只是想添加一个ActionListener

现在doClick。这有点邪恶的方法。首先它阻止了EDT。这可能是使它看起来像按下按钮的最简单方法。从编程逻辑的角度来看,最好远离修改Swing组件,因为当您可以将所有内容都保存在抽象代码中时。

从组件中删除和添加监听器通常是一个糟糕的主意。您的代码应该确定如何处理某个事件,包括是否忽略它。在处理事件时在适当的时候这样做。不要复制不必要的状态。

一个潜在的问题是,代码似乎假定只有一个动作侦听器。可能有其他人。该代码在意外行为下不健壮。在初始化时设置组件,并且不需要再次引用它们。