2015-12-02 2 views
0

Существует код моей простой Программы. Существует четыре текстовых поля. Когда курсор находится на первом текстовомField Создается JOptionPane и при нажатии ok курсор перемещается в следующее поле, а OptionPane снова создается и т. Д. , когда курсор находится в четвертом поле, и я нажимаю OK на OptionPane, курсор перемещается в пятое поле " е». , когда курсор находится в поле, я напечатать 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) { 
    } 
} 

Когда нет OptionPane, курсор перемещается вперед от первого поля до четвертого и гравюр:

FIRST 
SECOND 
THIRD 
FOURTH 

но когда есть JOptionPane выход:

FIRST 
SECOND 
FIRST 
SECOND 
THIRD 
SECOND 
THIRD 
FOURTH 
THIRD 
FOURTH 
FOURTH 

можно увидеть тыс после второго поля он возвращается к первому, после третьего поля он возвращается ко второму, вместо того, чтобы идти на четвертый после четвертого поля, он возвращается к третьему.

Я хочу знать, почему? и как я могу это исправить?

ответ

0

Проблема в том, что каждый раз, когда вы нажимаете OK на JOptionPane, фокус возвращается к последнему активному JTextField до того, как будет показана JOptionPane, поэтому новое событие 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

Это то, что мне было нужно. Спасибо большое –

Смежные вопросы