我有以下程序。它应该在绿色的地面上打印红色文字。程序打开时,我只看到绿色背景,但没有看到红色文字。调整窗口大小并重新计算后,将显示红色文本。
如果我在窗口中使用JPanel并在那里添加组件,它可以正常工作。如果颜色在paintComponent中设置,则一切正常。
问题出在哪里,如果我直接在JFrame上绘图。我错过了第一次"更新"或者其他的东西?看起来窗口的第一次绘制(附加文本)中缺少一些信息,一旦窗口重新计算并重新绘制,程序才会知道该信息。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class PaintAWT extends JFrame {
PaintAWT() {
this.setSize(600, 400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
// Set background color:
// If you don't paint the background, one can see the red text.
// If I use setBackground I only see a green window, until it is
// resized, then the red text appears on green ground
this.getContentPane().setBackground(new Color(0,255,0));
// Set color of text
g.setColor(new Color(255,0,0));
// Paint string
g.drawString("Test", 50, 50);
}
public static void main(String[] args) {
new PaintAWT();
}
}
答案 0 :(得分:4)
您不应该在绘画方法中设置组件的属性。绘画方法仅用于绘画。不要使用setBackground()。
您应该在创建框架时设置内容窗格的背景。
每当您进行自定义绘制时,您还应该覆盖getPreferredSize()
方法以返回组件的大小。
您也不应该扩展JFrame。只有在向类添加功能时才扩展类。
首先阅读Custom Painting上Swing教程中的部分,了解更多信息和工作示例。这些示例将向您展示如何更好地构建代码以遵循Swing约定。
答案 1 :(得分:2)
您应该将setBackground移动到构造函数。在paint方法中设置背景是一种不好的方法。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class PaintAWT extends JFrame {
PaintAWT() {
this.setSize(600, 400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Set background color:
// If you don't paint the background, one can see the red text.
// If I use setBackground I only see a green window, until it is
// resized, then the red text appears on green ground
this.getContentPane().setBackground(new Color(0,255,0));
this.setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
// Set color of text
g.setColor(new Color(255,0,0));
// Paint string
g.drawString("Test", 50, 50);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PaintAWT();
}
});
}
}