Java 无法从子帧调用小程序中的重绘

Java 无法从子帧调用小程序中的重绘,java,events,applet,awt,Java,Events,Applet,Awt,我制作了一个小程序名为ParentApplet.java,其任务是创建子框架 子帧编码在ChildFrame.java中定义 ParentApplet.java } ChildFrame.java 公共类ChildFrame扩展了框架{ private String mess = ""; public ChildFrame(String title) { super(title); addMouseListener(new MyMouseAdapter(this));

我制作了一个小程序名为ParentApplet.java,其任务是创建子框架
子帧编码在ChildFrame.java中定义

ParentApplet.java

}

ChildFrame.java

公共类ChildFrame扩展了框架{

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

你的问题的答案基本上是“你不会那样做”

Applet的paint()方法负责绘制实际Applet组件的内容,即显示在网页中的可见组件。然后,您的子框架应该有一个单独的paint()方法来绘制自身(或者实际上,通常会向其添加一个画布,而该画布又有自己的paint()方法)

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

您可以在任意位置对任何组件调用repaint()。这最终将导致调用该组件的paint()方法。在您的特定示例中,您不应该调用“new ParentApplet()”——您不希望对一些随机创建的新小程序调用repaint(),而是对单个已存在的小程序调用repaint()。因此,通过将对小程序的引用传递到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(),其目的是设置小程序中显示的消息。在这种情况下,为什么不将setMessage()方法放在小程序上呢?但是,也许你有另一个原因可以用你自己的方式来做,这一点到目前为止还不明显。

所以你想说,没有办法从子框架中绘制父小程序?不是直接的,但不清楚你为什么要这样做?为什么不把小程序的绘制代码放在它所属的地方:在小程序的paint()方法中?我只是这样做了,我只是从子框架类调用小程序的repaint方法。(new ParentApplet()).repaint();这是来自调用ParentApplet的paint methodOK的子框架的代码,更新了我的答案。基本上,您可以随时对任何组件调用repaint()。但是您需要确保调用的组件是正确的。您试图创建一个新的applet对象,而您需要做的是在现有的applet对象上调用repaint()。唉,从我的角度看,这真是太傻了。我在理解awt、事件和小程序时迷失了方向,错过了这么简单的一点。非常感谢你,它确实解决了我的问题。:-)
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();
  }
}