当前位置: 首页 > 面试题库 >

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

韩耘豪
2023-03-14
问题内容

我正在遵循Java : The complete reference 8th edition (JDK 7)AWT上的示例,但无法在出现的窗口中成功显示字符串。尺寸和标题设置正确,并显示窗口。如果我在控制台上使用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)实际上隐藏在框架边框下。

你可以在这里看到更多关于它的信息。

相反,您应该绘制到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
图形,尤其是关于文本的讨论



 类似资料:
  • 我正在使用Linux并试图学习OpenGL。我参考了learnopengl.com网站,并在这里编译了第一个可用的程序。 我似乎在编译程序时没有遇到命令问题 但是当我运行程序时,它会从后面显示东西,而不是像这样的空白窗口 但是请注意,此窗口不透明,因为如果我移动窗口,背景是相同的。但是,如果我最小化并重新打开窗口,则背景是新创建的。专用和集成 GPU 都会发生这种情况。 我需要做什么才能使它正常工

  • 问题内容: 我正在尝试通过py2exe创建一个exe。该程序正在使用Tkinter显示类似弹出窗口的窗口。问题是,当我像这样运行安装程序时,一切正常: 但是当我尝试制作一个文件的exe时失败: 实际上,最终exe可以正常运行,但是不会显示任何窗口。我已经阅读过Windows 7上的bundle_files = 1可能存在问题,但我也尝试了bundle_files = 2来达到同样的效果。这是我的m

  • 我正在为平台游戏做教程,但我的Pygame窗口显示一个黑屏。 我不知道怎么解决这个问题。 我尝试再次关闭和打开Visual Studio Code,但没有任何结果。

  • 我今天下载了LWJGL3,发现它几乎完全重写了。我查阅了一个关于如何创建窗口的教程,但我仍然有创建窗口的问题。 代码运行时没有问题:控制台中没有错误,但窗口没有显示!

  • 我有一个docker容器,它可以打开一个tkinter窗口,但它一直崩溃,因为它无法连接到主机的显示器。本文给出的答案建议将X-11套接字绑定到容器< code >-v/tmp/. X11-unix:/tmp/. X11-UNIX:ro ,并将其显示环境变量设置为主机< code>-e DISPLAY=$DISPLAY的显示环境变量,但由于这两个变量都是UNIX特定的路径/变量,因此它们在其他操作

  • #include <stdio.h> void fun1(void) { int i = 0; i++; i = i * 2; printf("%d\n", i); } void fun2(void) { int j = 0; fun1(); j++; j = j