【问题标题】:Unable to call the repaint in applet from child frame无法从子框架调用小程序中的重绘
【发布时间】:2012-06-11 06:02:36
【问题描述】:

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

父Applet.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 方法。请建议我是否做错了什么或我需要理解的事情。

提前致谢 加甘迪普·辛格

【问题讨论】:

    标签: java events applet awt


    【解决方案1】:

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

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

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

    你可以在任何你喜欢的地方对任何组件调用 repaint()。这最终会导致调用该组件的 paint() 方法。在您的特定示例中,您不应该调用“new ParentApplet()”——您不想在一些随机创建的新小程序上调用 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()方法中?
    • 我只是这样做了,这只是我从子框架类调用applet的repaint方法。(new ParentApplet()).repaint();这是子框架调用ParentApplet的paint方法的代码
    • 好的,已经更新了我的答案。基本上,您可以随时在所需的任何组件上调用 repaint()。但是您需要确保在正确的组件上调用它。您试图创建一个 new 小程序对象,而您需要做的是在现有的上调用 repaint()。
    • Aaah 傻在我这边确实很傻。我迷失了对awt、事件和小程序的理解,我错过了这么简单的一点。非常感谢你,它确实解决了我的问题。 :-)
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2020-10-27
    相关资源
    最近更新 更多