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

标签 java awt

我正在关注 AWT 上 Java 的完整引用第 8 版 (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);
    }
}

最佳答案

您遇到的问题是您直接在框架顶部绘画。该框架还包括框架边框,因此位置 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有一些兴趣,尤其是关于文本的讨论

关于Java AWT drawString() 不显示在窗口上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499375/

相关文章:

java - Android 如何查看我的 SQLite?

java - 如何在 OSGi 中通过 HttpService 发布 JAX-WS

java - MouseListener和KeyListener同时使用

java - 为什么这个 JComponent 绘制不正确?

java - 如何在 Linux 上的 Jenkins 中修复 java.awt.HeadlessException

java - 半透明窗口错误让我头疼

java - 在 headless (headless)服务器上绘制图像

java - 如何使用 Java 停止/禁用互联网访问?

java - Windows 上 java JTextArea 中的所有语言支持字体

java - 格式日期从 8 月 14 日到 YYYYMMDD