3

最近、私はグラフィックスを使ってJavaの仕事をしようとしています。これで、Graphicsクラスは抽象になります。つまり、それ自体はインスタンス化できませんが、そのサブクラスはインスタンス化できる可能性があります。したがって、次のコードで何が起こっているのでしょうか。(それは正常に線を作成します)

import javax.swing.*;
import java.awt.*;

public class line extends JPanel {
    public void paintComponent(Graphics g) {
        g.drawLine(0, 0, 90, 90);
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.add(new line());
        jf.setSize(500, 500);
        jf.setVisible(true);
    }
}

さて、今、いくつかのことが私には意味がありません。まず、lineが呼び出されると、lineクラスでpaintComponentメソッドを実行する必要があります。これは静的メソッドのプロパティです(クラス名で呼び出されます)。ただし、paintComponentメソッドには静的修飾子がありません。

このプログラムは機能するので、paintComponentが呼び出され、引数としてGraphicsオブジェクトを期待していると想定する必要があります。引数がないのに呼び出されたとき。なぜこれでエラーが発生しないのですか?Stringを渡してから、Integerオブジェクトを期待していたメソッドに何も渡さずにいくつかのテストを実行しました。両方のプログラムでエラーが発生しました。

したがって、どういうわけか、gというグラフィックスオブジェクトが作成され、はdrawlineメソッドを使用します。しかし、グラフィックスは抽象的です。

さて、ここに私の質問があります:

  1. paintComponentが静的でないときにクラス行が呼び出されると、paintComponentが自動的に呼び出されるのはなぜですか?

  2. Graphicsオブジェクトが必要なのにpaintComponentが空の引数を受け入れるのはなぜですか?

  3. Graphicsクラスは抽象的でインスタンス化できないため、Graphicsオブジェクトgはどのように作成されますか?

StackOverflowを手伝ってください。あなたが私の唯一の希望です。

編集:さて、私はこの質問がかなりよく答えられていると思います、ありがとう!

4

3 に答える 3

8
  1. paintComponentは、AWTがウィンドウをペイントする時期であると判断したときに呼び出されます(ほとんどの場合、OSがウィンドウをペイントするように指示するメッセージを送信するためです)。JFrameをペイントすると、その中にあるオブジェクトのツリーをトラバースします。その中には、jf.add(new Line())呼び出しで追加したためのlineのインスタンスがあります。これらのそれぞれで、paintComponentメソッドが呼び出されます。

  2. 空の引数は受け入れません。

  3. AWTがpaintComponentを呼び出すと、Graphicsから継承する具象クラスのインスタンスを渡します。

シグニチャpaintComponent(Graphics g)は、パラメータが正確にGraphicsタイプである必要があることをあまり示していません。しかし、実際には、グラフィックスタイプまたはグラフィックスから継承するクラスである必要があると言っています。別の見方をすれば、Graphicsから継承するクラスもGraphicsタイプであると言うことです。

于 2012-08-04T07:13:49.223 に答える
0

アプレット内の画面に線、形、文字、および画像を描画します。Javaでのグラフィック操作のほとんどは、Graphicsクラスで定義されたメソッドです。アプレットに何かを描画するために、Graphicsのインスタンスを作成する必要はありません。アプレットのpaint()メソッドでは、Graphicsオブジェクトが与えられます。そのオブジェクトに描画することで、アプレットに描画し、結果が画面に表示されます。Graphicsクラスはjava.awtパッケージの一部であるため、アプレットが(通常どおりに)ペイントを行う場合は、Javaファイルの先頭にそのクラスをインポートするようにしてください..........。 ..。。

于 2017-05-02T11:14:46.210 に答える
0

知っておく必要があるのは、paintComponent()はAWTによってのみ呼び出され、初めて呼び出されるのではないということです。ただし、メソッド「repaint()」は、内部でpaintComponent()を呼び出してグラフィックを更新するため、使用できます。また、グラフィックオブジェクトはGraphicsの内部サブクラスによって作成されます。したがって、paintComponent()が呼び出される前に、AWTはGraphicsを拡張するクラスのオブジェクト(gを想定)を作成します。その後、AWTは「g」オブジェクトを渡すことによって定義されたpaintCompoent()を呼び出します。

これは、actionPerformed()メソッドがリスナーで機能するのと同じです。定義するだけですが、実際にどこで呼び出されているのかわかりません。実際には、これらはJVM(Java仮想マシン)によって実行されるタスクです。

jbutton.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
      //Do sth on button click.
   }
});
于 2019-10-03T04:35:14.797 に答える