在父Applet方法中打开Java Applet或Frame并等待输入

时间:2014-01-17 19:12:52

标签: java swing applet awt

我有一个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

来实现

2 个答案:

答案 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

  1. JPanel。我们的想法是使用选项窗格中现成的OK / Cancel按钮来告诉主应用程序。是否实际使用图像绘制。我(作为用户)倾向于期望Clear按钮不在解除对话框的按钮组中。将该按钮放在您传递到选项窗格的面板中。
  2. 模态JOptionPane.showMessageDialog(..)。创建对话框比使用选项窗格更有效,但也更通用。例如,如果放入对话框的面板具有“设置绘图大小”选项,则调整对话框的大小比选项窗格更容易。
  3. JDialog的另一张牌。之前的两个建议具有阻止应用程序的优势。 和浏览器直到被解雇。这很好,因为您可以在显示后立即查询绘图的状态,确信用户已完成绘图。但不好的是,用户可能会在屏幕上显示对话框或选项窗格30分钟,并且在那段时间内其他浏览器将无法访问。通过翻转到显示绘图面板的卡片,浏览器不会被阻止,而应用程序也是如此。一旦用户进行了一个OK / Cancel选择,就可以查询绘图的状态。