我有一个Java applet(让我们称之为parentApplet
),公共方法必须返回有关已执行操作状态的信息(让我们称之为getUserInput()
)。此方法打开另一个需要用户按钮输入的Applet,将其添加为具有add(childApplet)
的子项,然后将其自身(父项)添加为{{1中的按钮的 ActionListner 当用户点击childApplet
中的按钮时,能够运行其他方法。
我的问题是,在用户点击childApplet
按钮之前,如何停止getUserInput()
执行?
我尝试使用一个跟踪返回信息的静态变量,并在childApplet
上旋转,但它会阻止主线程。
PS:将childApplet作为applet可以更改为可以更好地满足在父applet上打开另一个面板的要求的任何内容。
while(var == null) Thread.Sleep(1000);
getUserInput()
有一个画布(来自childApplet
的{{1}}对象),用户可以在其上绘制,然后是OK / Clear / Cancel按钮。当用户按下OK时,我需要绘制Graphics
。你知道这是否可以通过扩展BufferedImage
?
答案 0 :(得分:1)
您确实需要重新构建您的应用。你不能按照你想要的方式去做。 尝试使用输入字段和确定/取消按钮创建一个JDialog。 然后显示对话框:
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构造函数以传递默认值。
答案 1 :(得分:1)
childApplet
有一个画布(来自Graphics
的{{1}}个对象),用户可以在其上绘制和确定/清除/取消按钮。当用户按下OK时,我需要绘制BufferedImage
。
首先,它不应该是applet而是BufferedImage
(作为applet并不是不可能,但也不是无关紧要)。然后,您可以通过以下三种方式之一显示JPanel
。
JPanel
。我们的想法是使用选项窗格中现成的OK / Cancel按钮来告诉主应用程序。是否实际使用图像绘制。我(作为用户)倾向于期望Clear按钮不在解除对话框的按钮组中。将该按钮放在您传递到选项窗格的面板中。JOptionPane.showMessageDialog(..)
。创建对话框比使用选项窗格更有效,但也更通用。例如,如果放入对话框的面板具有“设置绘图大小”选项,则调整对话框的大小比选项窗格更容易。JDialog
的另一张牌。之前的两个建议具有阻止应用程序的优势。 和浏览器直到被解雇。这很好,因为您可以在显示后立即查询绘图的状态,确信用户已完成绘图。但不好的是,用户可能会在屏幕上显示对话框或选项窗格30分钟,并且在那段时间内其他浏览器将无法访问。通过翻转到显示绘图面板的卡片,浏览器不会被阻止,而应用程序也是如此。一旦用户进行了一个OK / Cancel选择,就可以查询绘图的状态。