首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FocusListener & JOptionPane

FocusListener & JOptionPane
EN

Stack Overflow用户
提问于 2015-12-02 23:42:31
回答 1查看 326关注 0票数 0

这是我的简单程序的代码。有四个textFields。当光标在第一个textField上时,JOptionPane被创建,当我按ok游标移动到下一个字段,再次创建OptionPane时,当游标位于第四个字段时,单击OptionPane上的OK,光标移动到第五个字段"f“。当光标在字段中时,我在数组中打印字段的位置:System.out.println(“第一或第二或第三或第四”)

代码语言:javascript
复制
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时,光标从第一个字段向前移动到第四个字段并打印:

代码语言:javascript
复制
FIRST
SECOND
THIRD
FOURTH

但是,当有JOptionPane时,输出是:

代码语言:javascript
复制
FIRST
SECOND
FIRST
SECOND
THIRD
SECOND
THIRD
FOURTH
THIRD
FOURTH
FOURTH

可以看出,在第二场之后,它回到了第一场,在第三场之后,它又回到了第二场,而不是第四场之后,它又回到了第三场。

我想知道为什么?我该怎么解决这个问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 03:07:05

问题是,每次单击JOptionPane上的OK时,焦点将返回到显示JOptionPane之前的最后一个JOptionPane活动,因此将向该控件的事件队列中添加一个新的requestFocus事件。实际上,在第一次执行代码时单击OK之后,会触发几个对话框,只是看不到它,因为每次都显示相同的文本(HELLO)。我已经修改了你的代码让它正常工作。希望能帮上忙!

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34055257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档