问题集中的JTextField(Problem to focus JTextField)

2019-10-21 02:55发布

(问题出现在Ubuntu只在Windows工作正常。我不知道在其他Linux环境)

我已经使用了的ComponentListener的方法在对话中呼吁焦点JTextField中,但这种情况下,只是不工作,我不知道为什么。 它显示在文本字段和快速变化给该按钮的焦点。 运行看看:

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class User {

    private String username = "";
    private String password = "";

    public User() {
    // default constructor
    }

    public User(String username, String password) {
    this.username = username;
    this.password = password;
    }

    /** Create a panel containing the componet and tha label. */
    public JPanel createLabeledComponent(JLabel label, Component comp) {
    GridLayout layout = new GridLayout(2, 1);
    JPanel panel = new JPanel(layout);
    panel.add(label);
    panel.add(comp);
    label.setLabelFor(comp);
    return panel;
    }

    public void showEditDialog() {

    JLabel usernameLbl = new JLabel(username);
    final JTextField usernameField = new JTextField();
    usernameField.setText(username);
    JPanel usernamePnl = createLabeledComponent(usernameLbl, usernameField);

    JLabel passwordLbl = new JLabel(password);
    JPasswordField passwordField = new JPasswordField(password);
    JPanel passwordPnl = createLabeledComponent(passwordLbl, passwordField);

    Object[] fields = { "User:", usernamePnl, "Password:", passwordPnl };

    JOptionPane optionPane = new JOptionPane(fields, JOptionPane.PLAIN_MESSAGE,
        JOptionPane.OK_CANCEL_OPTION, null, null);
    JDialog dialog = optionPane.createDialog("User Data");

    dialog.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentShown(ComponentEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
            usernameField.requestFocusInWindow();
            }
        });
        }
    });

    dialog.setVisible(true);
    }

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
        new User().showEditDialog();
        }
    });
    }

}

不知道如何解决这个问题?

--update

一切都在EDT现在正在运行。 可悲的是具有相同的行为。

顺便说一句,无论是使用JOptionPane构造函数的最后一个参数(对象初值)不起作用。

Answer 1:

我记得有类似的问题,我曾经在这个页面的底部找到了解决办法:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5018574



Answer 2:

也许这个对话聚焦解决方案将在Ubuntu的工作(我不能测试它)。

它显示在文本字段和快速变化给该按钮的焦点。

或者你可以尝试包裹requestFocusInWindow()方法调用的SwingUtilities.invokeLater()把你的requrest在美国东部时间结束。



Answer 3:

从如何使用对焦Subsytem :

窗口究竟是如何获得的焦点取决于窗口系统上。 没有任何万无一失的方法,在所有平台上,以确保窗口获得焦点。

此外,从Component.requestFocusInWindow :

尽一切努力将作出该请求; 然而,在某些情况下可能无法这样做。 开发人员必须永远不能假定此Component是焦点所有者在此Component接收FOCUS_GAINED事件。

您呼叫之前,您的组件可能无法实现requestFocusInWindow 。 你试图把一个dialog.pack(); 之前setVisible(true)



文章来源: Problem to focus JTextField