2015-12-02 116 views
0

有我簡單的程序代碼。 有四個textFields。 當光標在第一文本框的JOptionPane創建,當我按OK 光標移動到下一個字段和選項窗格再次創建 等 當光標在第四場,我點擊選項窗格OK,光標移動到第五領域「 F」。 當光標在字段中,我打印在陣列的字段的possition內容:System.out.println(「第一或第二或第三或第四」)FocusListener&JOptionPane

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class Hello extends JFrame implements ActionListener, FocusListener { 

    public JTextField[] fields = new JTextField[4]; 
    public JPanel panel = new JPanel(); 
    public JTextField f = new JTextField(12); 
    public static void main(String[] args) { 
     new Hello(); 
    } 

    public Hello() { 
     for (int i = 0; i < 4; i++) { 
      fields[i] = new JTextField(12); 
      fields[i].addFocusListener(this); 
      panel.add(fields[i]); 
     } 
     add(panel); 
     add(f); 
     setTitle("Hello World"); 
     getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(920, 420); 
     setLocation(100, 100); 
     setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
    } 

    @Override 
    public void focusGained(FocusEvent fe) { 
     if (fe.getSource() == fields[0]) { 
      JOptionPane.showMessageDialog(null, "HELLO");    
      fields[1].requestFocus(); 
      System.out.println("FIRST"); 
     } else if (fe.getSource() == fields[1]) { 
      JOptionPane.showMessageDialog(null, "HELLO");   
      fields[2].requestFocus(); 
      System.out.println("SECOND"); 
     } else if (fe.getSource() == fields[2]) { 
      JOptionPane.showMessageDialog(null, "HELLO");    
      fields[3].requestFocus(); 
      System.out.println("THIRD"); 
     } else if (fe.getSource() == fields[3]) { 
      JOptionPane.showMessageDialog(null, "HELLO");   
       f.requestFocus(); 
       System.out.println("FOURTH") 
     } 
    } 

    @Override 
    public void focusLost(FocusEvent fe) { 
    } 
} 

當沒有選項窗格,光標移到向前從第一場到第四和打印:

FIRST 
SECOND 
THIRD 
FOURTH 

但是當存在的JOptionPane 輸出爲:

FIRST 
SECOND 
FIRST 
SECOND 
THIRD 
SECOND 
THIRD 
FOURTH 
THIRD 
FOURTH 
FOURTH 

人們可以看到第在第二場之後,它回到第一場,第三場後它回到第二位,而不是在第四場後回到第三場,然後進入第四場 。

我想知道爲什麼?我該如何解決這個問題

回答

0

問題是,每次在JOptionPane上單擊OK時,焦點將返回到顯示JOptionPane之前活動的最後一個JTextField,因此將新的requestFocus事件添加到事件隊列中該控制。實際上,第一次在執行代碼時單擊確定後,會出現幾個對話框,您不會看到它,因爲每次都顯示相同的文本(HELLO)。我已更改您的代碼以使其正常工作。希望能幫助到你!

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.util.ArrayList; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class testOptionPane extends JFrame implements ActionListener, FocusListener { 

    public ArrayList<JTextField> fields = new ArrayList<>(); 
    public JPanel panel = new JPanel(); 
    public JTextField f = new JTextField(12); 
    private int currentField = 0; 
    private boolean focusReturned = false; 
    public static void main(String[] args) { 
     new testOptionPane(); 
    } 

    public testOptionPane() { 
     for (int i = 0; i < 4; i++) { 
      JTextField tf = new JTextField(12); 
      fields.add(tf); 
      tf.addFocusListener(this); 
      panel.add(tf); 
     } 
     add(panel); 
     fields.add(f); 
     add(f); 
     setTitle("Hello World"); 
     getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(920, 420); 
     setLocation(100, 100); 
     setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
    } 

    @Override 
    public void focusGained(FocusEvent fe) { 
     if (fe.getSource() == fields.get(currentField)) { 
      if (!focusReturned) { 
       JOptionPane.showMessageDialog(this, "focus on field " + String.valueOf(currentField)); 
       System.out.println(currentField); 
       focusReturned = true; 
      } else { 
       currentField++; 
       focusReturned = false; 
       if (currentField < fields.size()) { 
        fields.get(currentField).requestFocus(); 
       } 
      } 
     } 
    } 

    @Override 
    public void focusLost(FocusEvent fe) { 
    } 
} 
+0

這就是我需要的。謝謝很多 –