【发布时间】:2012-02-24 08:13:20
【问题描述】:
这个问题解决了。
我正在开发一个基于 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);
【问题讨论】:
-
您知道可以将任何 JComponent(实际上是任何 Object,但大多数 Object 不会按照您希望的方式工作)作为参数吗?将
this作为父级(就像您在示例中所做的那样),GUI 的其余部分应该“锁定”。 -
显然您正在做一些自定义绘画,而不是使用自定义 LaF。
-
是的,没错,它实际上并不是加载真正的 LookAndFeel,而是通过 Netbeans 为每个组件分配属性。不管操作流程有多好,这些都是我必须遵守的,从上而下的。
-
@Reivax,感谢您的确认!
标签: java swing blocking jdialog joptionpane