Java 无法从子帧调用小程序中的重绘
我制作了一个小程序名为ParentApplet.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));
子帧编码在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();
}
}