【问题标题】:Java AWT drawString() does not display on windowJava AWT drawString() 不在窗口上显示
【发布时间】:2013-07-04 04:13:40
【问题描述】:

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

【问题讨论】:

  • @MadProgrammer 我没有看到 setVisible xD 应该调用 super.paint()
  • @nachokk +1 for super.paint()...但真正的问题是为什么要使用 AWT?
  • 为什么选择 AWT 而不是 Swing?请参阅Swing extras over AWT 上的此答案,因为有很多放弃使用 AWT 组件的充分理由。如果您需要支持较旧的基于 AWT 的 API,请参阅 Mixing Heavyweight and Lightweight Components
  • 老实说,我学习 AWT 只是因为它是本书的下一章。 Swing 将在几章后介绍。书上说学习 AWT 很好,因为 Swing 是在它之上构建的。
  • “这本书说学习 AWT 很好,因为 Swing 是在它之上构建的。” 这本书具有误导性。 AWT 的“非组件”部分在 Swing 中广泛使用。 OTOH,您永远不必使用 AWT 组件,并且鉴于它们的用途不同,它只会使事情变得混乱。提示:添加@MadProgrammer(或重要的@)以通知他们有新评论。

标签: java awt


【解决方案1】:

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

你可以看到更多关于here的信息。

相反,您应该在 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 Graphics 有一些兴趣,尤其是关于文字的讨论

【讨论】:

    【解决方案2】:

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

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

    你会看到它出现

    【讨论】:

    • 是的,但是为什么呢?此外,不鼓励开发人员直接绘制顶级容器,特别是因为 OP 遇到问题...
    • @MadProgrammer:超类中的绘画绘制了所有的窗口装饰等。太 afaik 这意味着 0,0 不能占标题栏。您的示例要好得多,但是对于从书中尝试一些东西,我认为直接使用 paint() 并没有什么大不了的。我假设 OP 不想将其作为商业组件发布
    • 别告诉我,告诉 OP ;)
    • 谢谢你!我在 cmets 中解释了我的问题的原因。
    猜你喜欢
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2015-09-23
    • 2021-06-07
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多