Java swing.JFrame仅在调整窗口大小时绘制内容

时间:2016-04-25 16:05:21

标签: java swing jframe paint

我有以下程序。它应该在绿色的地面上打印红色文字。程序打开时,我只看到绿色背景,但没有看到红色文字。调整窗口大小并重新计算后,将显示红色文本。

如果我在窗口中使用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();
    }

}

2 个答案:

答案 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();
            }
        });
    }

}