0

子フレームを作成することをタスクとするアプレット名 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 class ChildFrame extends 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 class MyMouseAdapter extends 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 class MyWindowAdapter extends WindowAdapter {

ChildFrame frame;

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

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

}

ChildFrame クラスから repaint メソッドを呼び出した後でも、再び paint メソッドに到達できなくなりました。私が何か間違ったことをしたのか、それとも理解する必要があるのか​​ 教えてください。

前もって感謝します ガガンディープ・シン

4

1 に答える 1

1

あなたの質問に対する答えは、基本的に「あなたはそれをしない」です。

アプレットの paint() メソッドは、実際のアプレット コンポーネント (つまり、Web ページに表示される可視コンポーネント) の内容を描画します。次に、ChildFrame には、それ自体をペイントする別の paint() メソッドが必要です (実際には、通常は Canvas が追加され、その Canvas には独自の paint() メソッドがあります)。

(Java では、「フレーム」は事実上「ウィンドウ」であることに注意してください。つまり、Web ページとは別に開くスタンドアロン ウィンドウです。)

好きな場所から任意のコンポーネントで 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() メソッドを追加しないのはなぜですか? しかし、今のところ明らかになっていない別の理由があるかもしれません。

于 2012-06-07T07:38:33.560 に答える