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

我正在关注Java : The complete reference 8th edition (JDK 7)的示例Java : The complete reference 8th edition (JDK 7) 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); } } 

您遇到的问题是您直接在框架上绘画。 框架还包括框架边框,因此位置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图形 ,尤其是对文本的讨论

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

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

你会看到它出现