繁体   English   中英

FocusListener和JOptionPane

[英]FocusListener & JOptionPane

这是我简单程序的代码。 有四个文本字段。 当光标位于第一个textField JOptionPane上时,当我按OK时,光标移至下一个字段,并且再次创建OptionPane,依此类推,当光标位于第四个字段上并在OptionPane上单击OK时,光标移至第五个字段“ f”。 当光标位于字段中时,我在数组中打印字段的位置:System.out.println(“ first或Second或Third或Fourth”)

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

可以看到,在第二场之后回到第一位,在第三场之后回到第二位,而不是在第四场之后回到第四位。

我想知道为什么吗? 以及我该如何解决

问题在于,每次在JOptionPane上单击“确定”时,焦点将返回到显示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) {
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM