[英]How can I give this password field focus?
這可能看起來微不足道,但我不知道如何在此對話框焦點中指定密碼框。
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
public class PasswordBox {
@SuppressWarnings("unused")
public String prompt() {
JPasswordField pass = new JPasswordField(10);
int action = JOptionPane.showConfirmDialog(null, pass,"Enter Password",JOptionPane.OK_CANCEL_OPTION);
return new String(pass.getPassword());
}
}
我從其他類中調用它,如下所示: String tmpPASS = new PasswordBox().prompt();
出於某種原因,當對話框出現時,“確定”按鈕獲得焦點。
stacktrace(參見 Eng.Fouad 的回答):
at javax.swing.JComponent.addNotify(Unknown Source)
at PasswordBox$1.addNotify(PasswordBox.java:14)
at java.awt.Container.addNotify(Unknown Source)
查看Dialog Focus中提供的解決方案。
編輯:
使用 Eng Fouad 建議的方法,我相信代碼應該是:
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}
};
編輯2:
“對話焦點”博客條目中的鏈接有一條評論,其中包含適用於 Linux 的建議。
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
public JOptionPane pane;
public class PasswordBox
{
@SuppressWarnings("unused")
public String prompt()
{
pane = new JOptionPane();
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
pane.addNotify();
requestFocus();
}
};
int action = pane.showConfirmDialog(null, pass,"Enter Password",JOptionPane.OK_CANCEL_OPTION);
return new String(pass.getPassword());
}
}
或者這是另一種方法:
JPanel panel = new JPanel();
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
panel.addNotify();
requestFocus();
}
};
panel.add(pass);
JOptionPane pane = new JOptionPane();
JButton btnOK = new JButton("OK");
JButton btnCancel = new JButton("Cancel");
Object[] options = {btnOK, btnCancel};
pane.showOptionDialog(null, panel, "Enter the password", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, null);
編輯(由 camickr 提供,如果不正確,請隨時刪除)。 我相信代碼應該是:
JPasswordField pass = new JPasswordField(10)
{
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}
};
這是一個工作解決方案,重點是密碼字段和工作按鈕
問題是 JOptionPane 是完全獨立的,並且似乎無法指定哪個 GUI 組件獲得初始焦點。 一種解決方案是編寫您自己的 Dialog 子類 - 這將使您可以准確控制布局並適當地設置焦點。
你也可以試試 javax.swing.SwingWorker。 您可以創建其中一個並在顯示密碼對話框之前啟動它。 在 doInBackground() 方法中,休眠一小段時間,在 done() 方法中使用 SwingUtilties.invokeLater() 並在 Runnable 中發出 pass.requestFocusInWindow()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.