我正在按照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);
}
}
Run Code Online (Sandbox Code Playgroud)
您遇到的问题是您直接在框架顶部绘画。该框架还包括框架边框,因此位置 0, 0(或在您的情况下为 10, 10)实际上隐藏在框架边框下。
您可以在此处了解更多相关信息。
相反,您应该绘制到 aCanvas并将其添加到框架中

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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
下一个想到的问题是,为什么是 AWT?API 已经被 Swing 封杀了。如果不出意外,它会自动双缓冲;)
ps-您可能还会发现一些感兴趣的2D 图形,尤其是关于文本的讨论