2012-07-17 85 views
4

我在我的對話框中有一個按鈕。在按下回車鍵後,分配給該按鈕的動作將逐個調用。java swing:焦點丟失,輸入關鍵事件

public void buttonAction1() { } 
.... 
public void buttonAction2() { } 

在我的對話框中,我也有一個文本字段,其中偵聽了焦點丟失事件。每當最初焦點在該文本框內,我點擊標籤或使用鼠標我點擊按鈕,調用焦點丟失的事件並打開一個彈出窗口。此彈出窗口有助於設置文本字段內的值。該值將被按鈕按下時調用的操作使用。

public void focusLostAction() { } 

現在的問題是,當焦點位於文本字段內部並按下回車鍵時,焦點丟失事件不會被調用。所以彈出窗口不會被打開,並且在該文本字段中沒有設置正確的值。但是由於輸入了關鍵事件,對該關鍵按鈕的操作被調用,並且此操作無法在文本字段內找到適當的值。

裏面的動作方法,該方法被稱爲上輸入的鍵事件,我試圖將焦點設置按鈕來手動使用:

public void buttonAction1() { 
    button.requestFocusInWindow(); 
} 

public void buttonAction2() { 
    // do the remaining task 
} 

予使用,button.requestFocus也嘗試;

我期待手動設置焦點會在文本字段中調用鬆散焦點,焦點丟失事件可能會被調用(因爲這是在單獨的swing工作線程中實現的)。但它不起作用。請讓我知道,如果您之前遇到過這個問題並且解決方案相同。 謝謝。

+1

爲了更好的幫助下架失去重心越早,張貼[SSCCE(HTTP:/ /sscce.org)。如果焦點丟失事件未被調用,那麼問題是什麼?您何時在該按鈕上調用requestFocus? – 2012-07-17 07:48:43

+0

確切地說,你在寫'button.requestFocusInWindow();',因爲如果你在'JTextField'中按下'ENTER'鍵,那麼'actionPerformed(...)'方法將被調用,而不是'focusLost(...) )'如果你在用'JTextField'附加的'actionPerformed()'內部寫上面的行,那麼只有'focusLost()'方法才能得到調用。 – 2012-07-17 07:49:57

+0

我已經更新了Guillaume建議的查詢。我是否以不正當的方式做這件事? – user613114 2012-07-17 08:03:25

回答

4

這裏第二個JTextField按照您希望的方式行事。嘗試在此代碼示例你的手:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class TextFieldExample 
{ 
    private JTextField tfield1; 
    private JTextField tfield2; 
    private JLabel label; 
    private JButton button; 
    private FocusListener tfieldListener = new FocusListener() 
    { 
     @Override 
     public void focusGained(FocusEvent fe) 
     { 
     } 

     @Override 
     public void focusLost(FocusEvent fe) 
     { 
      System.out.println("I am LOST"); 
      String num1 = tfield1.getText().trim(); 
      String num2 = tfield2.getText().trim(); 
      if (num1 == null || num1.equals("")) 
       num1 = "0"; 
      if (num2 == null || num2.equals("")) 
       num2 = "0";   
      label.setText(Integer.toString(Integer.parseInt(num1) + Integer.parseInt(num2))); 
     } 
    }; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Text Field Focus Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 

     tfield1 = new JTextField(10); 
     tfield2 = new JTextField(10); 
     tfield2.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent ae) 
      { 
       button.requestFocusInWindow(); 
      } 
     }); 

     tfield1.addFocusListener(tfieldListener); 
     tfield2.addFocusListener(tfieldListener); 

     ((AbstractDocument)tfield1.getDocument()).setDocumentFilter(new MyDocumentFilter()); 
     ((AbstractDocument)tfield2.getDocument()).setDocumentFilter(new MyDocumentFilter()); 

     label = new JLabel("SUM IS"); 

     button = new JButton("USELESS"); 

     contentPane.add(tfield1); 
     contentPane.add(tfield2); 
     contentPane.add(label); 
     contentPane.add(button); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    class MyDocumentFilter extends DocumentFilter 
    { 
     @Override 
     public void insertString(FilterBypass fb, int offset 
               , String text 
               , AttributeSet aset) 
     { 
      try 
      { 
       super.insertString(fb, offset, text.replaceAll("\\D++", ""), aset); 
      } 
      catch(BadLocationException ble) 
      { 
       ble.printStackTrace(); 
      } 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int len 
              , String text 
              , AttributeSet aset) 
     { 
      try 
      { 
       super.replace(fb, offset, len, text.replaceAll("\\D++", ""), aset); 
      } 
      catch(BadLocationException ble) 
      { 
       ble.printStackTrace(); 
      } 
     }  
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TextFieldExample().displayGUI(); 
      } 
     }); 
    } 
} 
+0

親愛的nlcE,這個示例代碼工作正常。我需要檢查是否可以按照您提及的方式修改我的代碼。我已經用我之前嘗試過的更新了我的查詢。這樣做不正確嗎? – user613114 2012-07-17 08:22:39

+0

你指定的僅僅是方法,儘管在你使用它的地方是真實的東西,這就是爲什麼一個完整的[SSCCE](http://sscce.org/),將有很大的幫助更多:-) – 2012-07-17 16:12:17

+0

親愛的nlcE,我明白你的關心。其實問題是,文本字段是Subview的一部分。並且按鈕在父視圖中。我是新手,並且正在開發這一大塊代碼,它使用從swing開始擴展的類來開發。這是我無法給予SSCCE的共鳴。用你的例子,我只是修改了代碼來添加button.grabFocus()。現在它爲我工作。我爲此情況不提供SSCCE表示歉意。我會將您的解決方案標記爲答案,因爲它提供了關於確切內容的想法。非常感謝你。 – user613114 2012-07-18 06:54:48

0

增益和Java Swing應用程序

public class MainFrame extends Frame { 
Frame awe; 
public MainFrame(Database database) { 
    awe = this; 
    this.addWindowFocusListener(new WindowFocusListener() { 
     @Override 
     public void windowGainedFocus(WindowEvent we) { 
      System.out.println("Gain Focus"); 
     } 

     @Override 
     public void windowLostFocus(WindowEvent we) { 
      System.out.println("Lost Focus"); 
     } 
    }); 

}