问题焦点JTextField

(问题只发生在Ubuntu中,在Windows中工作正常,在其他Linux环境中我不知道)

我已经使用ComponentListener的方法在对话框中调用JTextField中的焦点,但是对于这种情况只是不工作,我不知道为什么。 它显示文本字段中的焦点并快速切换到button。 快来看看:

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构造函数的最后一个参数(Object initialValue)不起作用。

我记得有一个类似的问题,我使用了本页底部的解决方案:

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

也许这个Dialog Focus解决方案可以在Ubuntu上运行(我无法测试它)。

它显示文本字段中的焦点并快速切换到按钮。

或者您可以尝试在SwingUtilities.invokeLater()中调用requestFocusInWindow()方法调用,以将请求放在EDT的末尾。

从如何使用焦点子系统 :

一个窗口如何获得焦点取决于窗口系统。 在所有平台上都没有万无一失的方法来确保窗口获得关注。

此外,从Component.requestFocusInWindow :

将尽一切努力来尊重这一要求; 但是,在某些情况下,这样做可能是不可能的。 开发人员决不能认为这个组件是焦点所有者,直到这个组件接收到一个FOCUS_GAINED事件。

在调用requestFocusInWindow之前,可能无法实现组件。 你有没有尝试把一个dialog.pack();setVisible(true)