(问题仅在 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();
}
});
}
}
知道如何解决这个问题吗?
--更新
现在一切都在 EDT 上运行。可悲的是,同样的行为。
顺便说一句,要么使用 JOptionPane 构造函数的最后一个参数(Object initialValue)不起作用。
最佳答案
我记得有过类似的问题,我使用了本页底部的解决方案:
关于java - 关注 JTextField 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2632785/