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