无法从子框架调用applet中的重绘

时间:2012-06-07 07:30:24

标签: java events applet awt

我创建了一个applet名称ParentApplet.java,其任务是创建子框架
子帧编码在ChildFrame.java中定义

ParentApplet.java

public class ParentApplet extends Applet {

ChildFrame frame;
private static int time = 0;

@Override
public void start() {
    frame.setVisible(true);
}

@Override
public void stop() {
    frame.setVisible(false);
}

@Override
public void init() {

    frame = new ChildFrame("Child");
    this.setSize(400, 400);
}

@Override
public void paint(Graphics g) {
    g.drawString("Child's Info : " + (++time), 50, 100);
    g.drawString(frame.getMessage(), 400, 100);
    System.out.println(frame.getMessage().isEmpty() ? "Empty" : frame.getMessage());
}

}

ChildFrame.java

公共类ChildFrame扩展了Frame {

private String mess = "";

public ChildFrame(String title) {
    super(title);
    addMouseListener(new MyMouseAdapter(this));
    addWindowListener(new MyWindowAdapter(this));
    setSize(300, 500);
}

public String getMessage() {
    return mess;
}

public void setMessage(String mess) {
    this.mess = mess;
    (new ParentApplet()).repaint();
    System.out.println("Click");
}

}

MyMouseAdapter.java

公共类MyMouseAdapter扩展了MouseAdapter {

ChildFrame frame;

public MyMouseAdapter(ChildFrame frame) {
    this.frame = frame;
}

@Override
public void mouseClicked(MouseEvent e) {

    frame.setMessage("Mouse Cliked in Child");  
}

}

MyWindowAdapter.java

公共类MyWindowAdapter扩展了WindowAdapter {

ChildFrame frame;

public MyWindowAdapter(ChildFrame frame) {
    this.frame = frame;
}

@Override
public void windowClosing(WindowEvent we) {
    frame.setVisible(false);
}

}

现在,即使从ChildFrame类调用repaint方法后,我也无法再次访问paint方法。请建议我是否做错了什么或者我需要了解的事情。

提前致谢 Gagandeep Singh

1 个答案:

答案 0 :(得分:1)

你的问题的答案基本上是“你不这样做”。

Applet的paint()方法负责绘制实际applet组件的内容 - 即网页中出现的可见组件。你的ChildFrame应该有一个单独的paint()方法来绘制自己(或者实际上,通常会添加一个Canvas,而Canvas又有自己的paint()方法)。

(请记住,在Java中,“Frame”实际上是一个“窗口” - 即一个独立的窗口,它单独打开到网页。)

您可以在任何您喜欢的任何组件上调用repaint()。这最终将导致调用该组件的paint()方法。在您的特定示例中,您不应该调用“new ParentApplet()” - 您不希望在一些随机创建的新applet上调用repaint(),而是在单个已存在的applet上调用repaint()。因此,通过将对applet的引用传递给ChildFrame的构造函数来更改它,然后ChildFrame可以将其作为实例变量保存并在需要时重新使用:

public class ChildFrame extends Frame {

  private String mess = "";
  private final ParentApplet parentApplet;

  public ChildFrame(ParentApplet applet, String title) {
    super(title);
    this.parentApplet = applet;
    addMouseListener(new MyMouseAdapter(this));
    addWindowListener(new MyWindowAdapter(this));
    setSize(300, 500);
  }
  ...
  public void setMessage(String mess) {
    this.mess = mess;
    parentApplet.repaint();
  }
}

我必须承认,到目前为止,为什么你会在一个单独的框架上有一个setMessage(),其目的是设置applet中显示的消息,这一点并不是很明显。为什么不在这种情况下将setMessage()方法放在applet上?但也许你有另一个理由以你的方式做到这一点,到目前为止还不明显。