java - 无法从子框架调用小程序中的重绘

标签 java events applet awt

我制作了一个名为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

公共(public)类 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

公共(public)类 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

公共(public)类 MyWindowAdapter 扩展 WindowAdapter {

ChildFrame frame;

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

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

}

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

提前致谢 加甘迪普·辛格

最佳答案

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

Applet 的 Paint() 方法负责绘制实际 Applet 组件的内容——即出现在网页中的可见组件。然后,您的 ChildFrame 应该有一个单独的 Paint() 方法来绘制自身(或者实际上,通常会添加一个 Canvas,而该 Canvas 又具有自己的 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() 方法放在小程序上呢?但也许您还有另一个目前尚不明显的理由以您的方式这样做。

关于java - 无法从子框架调用小程序中的重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10927480/

相关文章:

java - Fastjson反序列化返回null

java - Jface ContentProposalAdapter 不适用于第一个输入的字符

java - Canvas 对象未显示,但位置在 Java Applet 中正确更新

java - 如何让一个简单的 Hello World Java 小程序在 Mac OS X 的浏览器中工作?

java - 如何在 Mac OS X 上以 32 位模式运行绑定(bind)到 .app 的 java 应用程序?

java - 单击按钮时如何打开新 Activity ?

java - JTable 中 JComboBox 的可用性功能

android - Jetpack Compose 显示来自 viewmodel 的小吃吧 - 单场直播 Activity

javascript - 停止应用于主干中同一事件对象的事件传播

java - 如何使用 Hyperic SIGAR API 和 APPLET 来检测客户端操作系统版本和架构