Java AWT drawString()不会显示在窗口上

时间:2013-07-06 03:24:53

标签: java awt

我正在关注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);
    }
}

2 个答案:

答案 0 :(得分:4)

您遇到的问题是您直接在画框顶部绘画。框架还包括框架边框,因此位置0,0(或在您的情况下为10,10)实际上隐藏在框架边框下。

您可以详细了解here

相反,您应该绘制到Canvas并将其添加到框架

enter image description here

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 Graphics,尤其是关于文本的讨论

答案 1 :(得分:1)

您的字符串被绘制但隐藏在窗口的标题栏下。只需使用例如

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

你会看到它出现