这个问题已经解决了。
我正在开发基于Java Swing的投影,以及外观&感觉应用程序是完全定制的。我们试图在整个程序中保持一致的外观,并且默认的Java对话框窗口不一样。
当前问题需要控制阻止调用用户提示。与JOptionPane.showConfirmDialog()类似,在这种情况下,静态调用会生成一个窗口,并停止程序流,直到用户选择一个选项。它还返回选项的值。请注意,GUI本身并未按逻辑锁定,但用户无法与其余部分进行交互。
int n = JOptionPane.showConfirmDialog(this,
"Are you sure?",
"Confirm"
JOptionPane.YES_NO_OPTION);
我想使用自定义外观和字符串复制此功能。理想情况下,我的代码如下所示:
String result = CustomPrompt.showPrompt(this,
"Please enter your name", //Text
"Prompt.", //Title
"John Smith"); //Default
这通常用于密码输入,我知道密码的返回类型不同,但这只是一个例子。这可以通过在几个类中使用一系列按钮和事件监听器来完成,但代码的可读性和应用程序的可靠性会降低。
框架将通过NetBeans构建并从那里进行自定义。我确实知道Swing中已存在这样的提示,但它看起来和感觉是完全不同的。
总结的问题:如何使用自定义框架以阻止方式提示用户输入。
此问题的解决方案如下:
public class PromptForm extends JDialog
{
transient char[] result;
public char[] getResult()
{
return result;
}
public PromptForm(Frame parent)
{
super(parent, true);
initComponents();
}
public void prompt()
{
this.setVisible(true);
}
public static char[] promptForPassword(Frame parent)
{
PromptForm pf = new PromptForm(parent);
pf.prompt();
return pf.getResult();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{
result = jPasswordField1.getPassword();
setVisible(false);
dispose();
}
private void initComponents() {...}
private javax.swing.JButton jButton1;
private javax.swing.JPasswordField jPasswordField1;
}
被叫:
char [] ret = PromptForm.promptForPassword(this);
JOptionPane.showMessageDialog(this, new String(ret), "Neat", JOptionPane.QUESTION_MESSAGE);
答案 0 :(得分:5)
让CustomPrompt
扩展JDialog,让构建者调用super
传递所有者Window
和所需的ModalityType。
public class CustomPrompt extends JDialog {
public static String showPrompt(Window parent, String title, String text,
String defaultText) {
final CustomPrompt prompt = new CustomPrompt(parent);
prompt.setTitle(title);
// set other components text
prompt.setVisible(true);
return prompt.textField.getText();
}
private JTextField textField;
// private if you only want this prompt to be accessible via constructor methods
private CustomPrompt(Window parent) {
super(parent, Dialog.DEFAULT_MODALITY_TYPE);
// Java >= 6, else user super(Frame, true) or super(Dialog, true);
initComponents(); // like Netbeans
}
// initComponents() and irrelevant code.
}