3

AWTの例に従っていJava : The complete reference 8th edition (JDK 7)ますが、表示されるウィンドウに文字列を表示できません。サイズとタイトルが正しく設定され、ウィンドウが表示されます。paint() メソッドでコンソールに文字列を出力すると、実際には数回呼び出されることがわかりますが、アプリケーションのウィンドウに文字列が表示されません。この例からどこが逸脱したのかわかりません。私は実際には少し少ないコードを持っています (彼らはマウスリスナーとキーリスナーを追加しました):\

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Main {
    public static void main(String[] args) {
        Application app = new Application();
        app.setSize(new Dimension(640, 480));
        app.setTitle("This is a test");
        app.setVisible(true);
    }
}

class MyWindowAdapter extends WindowAdapter {
    public void windowClosing(WindowEvent we) {
        System.exit(0);
    }
}

class Application extends Frame {
    public Application() {
        addWindowListener(new MyWindowAdapter());
    }

    public void paint(Graphics g) {
        System.out.println("Hey hey !");
        g.drawString("Test", 10, 10);
    }
}
4

2 に答える 2

5

あなたが抱えている問題は、フレームの上に直接ペイントしているという事実です。フレームにはフレーム境界も含まれているため、位置 0、0 (またはあなたの場合は 10、10) は実際にはフレーム境界の下に隠されています。

詳細については、こちらを参照してください。

代わりに、上に描画して、Canvasそれをフレームに追加する必要があります

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class BadFrame {

    public static void main(String[] args) {
        new BadFrame();
    }

    public BadFrame() {
        Application app = new Application();
        app.setSize(new Dimension(640, 480));
        app.setTitle("This is a test");
        app.setLayout(new BorderLayout());
        app.add(new MyCanvas());
        app.setVisible(true);
    }

    class MyWindowAdapter extends WindowAdapter {

        public void windowClosing(WindowEvent we) {
            System.exit(0);
        }
    }

    public class MyCanvas extends Component {

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            System.out.println("Hey hey !");
            g.drawString("Test", 10, 10);
        }

    }

    class Application extends Frame {

        public Application() {
            addWindowListener(new MyWindowAdapter());
        }

    }
}

次に頭に浮かぶ疑問は、なぜ AWT なのかということです。API は、Swing を支持して、大失敗に終わっています。他に何もなければ、自動的にダブルバッファリングされます;)

ps-特にテキストに関する議論など、興味深い2Dグラフィックスを見つけることもできます

于 2013-07-06T03:35:21.680 に答える
1

文字列は描画されますが、ウィンドウのタイトル バーの下に隠されています。たとえば、使用するだけです

g.drawString("Test", 10, 200); 

そしてあなたはそれが現れるのを見るでしょう

于 2013-07-06T03:29:56.733 に答える