打开java小程序或父小程序方法内的框架,等待输入
我有一个Java小程序(我们称它为打开java小程序或父小程序方法内的框架,等待输入,java,swing,applet,awt,Java,Swing,Applet,Awt,我有一个Java小程序(我们称它为parentApplet),带有一个公共方法,该方法必须返回有关已执行操作的状态的信息(我们称它为getUserInput())。此方法打开另一个需要用户按钮输入的小程序,方法是使用add(childApplet)将其添加为子级,然后将其自身(父级)添加为childApplet中按钮的ActionListner,当用户单击childApplet中的按钮时,能够运行其他方法 我的问题是,在用户单击childApplet按钮之前,如何停止getUserInput()
parentApplet
),带有一个公共方法,该方法必须返回有关已执行操作的状态的信息(我们称它为getUserInput()
)。此方法打开另一个需要用户按钮输入的小程序,方法是使用add(childApplet)
将其添加为子级,然后将其自身(父级)添加为childApplet
中按钮的ActionListner,当用户单击childApplet
中的按钮时,能够运行其他方法
我的问题是,在用户单击childApplet
按钮之前,如何停止getUserInput()
执行
我尝试使用一个跟踪返回信息的静态变量,并在while(var==null)线程上旋转
但是它阻塞了主线程,这是应该的
PS:将childApplet作为小程序可以更改为更好地满足在父小程序顶部打开另一个面板的要求的任何内容
有关getUserInput()的详细信息
childApplet
有一个画布(来自BufferedImage
的Graphics
对象),用户可以在画布上绘制和确定/清除/取消按钮。当用户按下OK时,我需要绘制buffereImage
。你知道这是否可以通过扩展JDialog来实现吗?你真的需要重新构造你的应用程序。你不能按你想的方式做。
尝试创建一个JDialog,使用输入字段和OK/Cancel按钮按您喜欢的方式进行设置。
然后,要显示对话框,请执行以下操作:
MyDialog dialog = new MyDialog(null, true); //true = modal
//dialog.setModalityType(ModalityType.DOCUMENT_MODAL); //or specify modal here
dialog.setVisible(true); //waits until dialog is closed
if (dialog.wasAccepted()) {
//grab values from dialog
dialog.getCanvas();
}
在对话框中,您将有:
private boolean accepted = false;
public boolean wasAccepted() {return accepted;}
public Canvas getCanvas() {return canvas;}
public ? getWhateverElseYouWant() {return ...;}
“确定”按钮将:
accepted=true;
dispose();
取消按钮将:
accepted=false;
dispose();
JDialog将在事件可见时泵送事件。因此,setVisible()函数将停止执行,直到对话框关闭
这样会更好,然后您可以返回许多用户输入字段。
您甚至可以更改JDialog构造函数以传入默认值
childApplet
有一个画布(来自BufferedImage
的Graphics
对象),用户可以在画布上绘制和确定/清除/取消按钮。当用户按下OK时,我需要绘制buffereImage
首先,它不应该是一个小程序,而应该是一个JPanel
(作为一个小程序来做这件事不是不可能的,但也不是微不足道的)。然后您可以通过以下三种方式之一显示JPanel
JOptionPane.showMessageDialog(..)
。我们的想法是使用选项窗格中现成的OK/Cancel按钮告诉主应用程序。是否实际使用图像绘制。我(作为用户)倾向于认为清除按钮不在关闭对话框的按钮组中。将该按钮放在传递到选项窗格的面板中
模态JDialog
。创建对话框比使用选项窗格要复杂得多,但也更通用。例如,如果放入对话框的面板具有“设置图形大小”选项,则调整对话框大小比调整选项窗格大小更容易
另一张卡片布局的卡片
。前面两个建议的缺点/优点是它们会阻止应用程序和浏览器,直到退出。这很好,因为您可以在显示图形后立即查询图形的状态,并确信用户已完成绘制。但不好的是,用户可能会让对话框或选项窗格在屏幕上停留30分钟,而在这段时间内他们将无法访问浏览器的其余部分。通过切换到显示绘图面板的卡片,浏览器不会被阻止,应用程序也不会被阻止。一旦用户做出“确定/取消”选择之一,即可查询图形的状态
使用JOptionPane.showInputDialog(..)
通过输入我不是想从用户那里获取字符串,请参阅以获取更多信息。这是问题中应该包含的相关信息:-/你说得对,谢谢你添加它。谢谢你的回答!很抱歉,我没有更好地解释getUserInput()
可以做什么,但我所说的输入并不意味着它应该得到一个字符串或类似的东西。该childApplet有一个画布(来自缓冲区图像
的图形
对象),用户可以在画布上绘制和确定/清除/取消按钮。当用户按下OK时,我需要绘制buffereImage
。您知道这是否可以通过扩展JDialog来实现吗?是的,您可以用JDialog做任何事情。在对话框中放置画布,并在对话框类中添加名为getCanvas()的函数。我已经编辑了上面的代码。我接受这一点,因为这是我特定问题的第一个答案,也就是说,请参阅以获取有关此主题的其他信息。我已经成功地测试了这一点,它只缺少一件事,如果(像我的情况)您需要对话框来阻止应用程序,您需要更改其模式。使用dialog.setModalityType(ModalityType)代码>,我得到了以下结果:*ModalityType.MODELESS:不阻止方法执行,也不阻止UI;*ModalityType.APPLICATION_MODAL:阻止方法执行和父UI;*ModalityType.DOCUMENT_MODAL:阻止方法执行,但不阻止父UI;我已编辑您的答案以添加此选项。您可以在构造函数参数中指定模式对话框。我通常会这样做,我会编辑代码。我接受Peter Quiring的答案,因为这是第一个答案,包含了我解决具体问题所需的信息,但公平地说,您的答案包含非常有用的信息,我认为应该以某种方式添加/合并/链接到答案中。从Java SE 6开始,您可以设置JDialog的ModalityType
,它允许您控制对话框是否阻止父代码执行和UI。更多信息