Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AWT drawString()不显示在窗口上_Java_Awt - Fatal编程技术网

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

Java AWT drawString()不显示在窗口上,java,awt,Java,Awt,我遵循AWT上的Java:complete reference 8th edition(JDK 7)中的示例,无法成功地在显示的窗口上显示字符串。大小和标题设置正确,窗口显示。如果我在控制台上以paint()方法输出一个字符串,我会看到它实际上被调用了几次,但该字符串不会出现在我的应用程序窗口中。我看不出我在哪里偏离了这个例子;实际上,我的代码少了一点(他们添加了鼠标侦听器和按键侦听器):\ 您的字符串将被绘制,但隐藏在窗口的标题栏下。只要使用例如 g.drawString("Test", 10

我遵循AWT上的
Java:complete reference 8th edition(JDK 7)
中的示例,无法成功地在显示的窗口上显示字符串。大小和标题设置正确,窗口显示。如果我在控制台上以paint()方法输出一个字符串,我会看到它实际上被调用了几次,但该字符串不会出现在我的应用程序窗口中。我看不出我在哪里偏离了这个例子;实际上,我的代码少了一点(他们添加了鼠标侦听器和按键侦听器):\


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

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

你会看到它出现

你遇到的问题是你直接在画框的顶部作画。帧还包括帧边框,因此位置0、0(或在您的示例中为10、10)实际上隐藏在帧边框下

你可以了解更多

相反,您应该在
画布上绘制,并将其添加到框架中

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?为了支持Swing,API已被封存。如果没有其他内容,它将自动进行双缓冲;)


ps-您可能也会发现一些有趣的内容,特别是关于文本的讨论,我没有看到setVisible xD应该调用super.paint()@nachokk+1来表示
super.paint()
…但真正的问题是为什么AWT?为什么AWT而不是Swing?关于放弃使用AWT组件的许多好理由,请参见上的回答。如果您需要支持旧的基于AWT的API,请参阅。老实说,我学习AWT只是因为它是本书的下一章。Swing将在几章后介绍。这本书说学习AWT是件好事,因为Swing是建立在它之上的。“这本书说学习AWT是件好事,因为Swing是建立在它之上的。”这本书具有误导性。AWT的“非组件”部件广泛用于Swing。OTOH您永远不应该使用AWT组件,并且考虑到它们的用途不同,这只会让事情变得混乱。提示:添加@MadProgrammer(或任何人,
@
很重要)来通知他们新的评论。是的,但是为什么?此外,应该劝阻开发人员不要直接绘制顶级容器,特别是因为OP与…@MadProgrammer有问题:超类中的绘制绘制了所有窗口装饰等。太糟糕了,这意味着0,0不能解释标题栏。你的例子要好得多,但对于从书中尝试一些东西,我不认为直接使用paint()有什么大不了的。我假设OP不想将其作为商业组件发布(不要告诉我,告诉OP;)谢谢你,伙计!我在对我的问题的评论中解释了原因。
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());
        }

    }
}