保持打印白色窗口

时间:2017-11-21 23:51:07

标签: java swing jframe

我写了这个非常简单的程序的方法(我试图弄清楚JFrame是如何工作的):

import java.util.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.*;
import javax.swing.*;

public class Display extends JFrame {
    private int larg = 512;
    private int lung = 512;

    public Display() {
        setSize(larg, lung);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void draw(Graphics gr) {
        Color color = new Color(100, 200, 0);
        gr.setColor(color);
        gr.fillRect(0, 0, larg, lung);
    }

    public static void main(String[] args) {
        new Display();
    }
}

但他们继续打印一个白色的窗口而不是(100,200,0)窗口,为什么会这样?

1 个答案:

答案 0 :(得分:3)

好的,你正在创建自己的绘画方法,绘画,并假设它以某种方式神奇地被调用。这不会发生,也不是Swing图形的工作方式。谷歌并浏览教程,但如果你这样做,你会发现你需要覆盖一个真正的绘画方法,一个存在于父组件中(paint表示JFrame,paintComponent表示JPanel,例如),你必须使确定 正确覆盖方法,通常使用@Override注释,否则它将无效。

教程还告诉你不要直接在JFrame中绘制,而是在JPAnel的paintComponent覆盖中绘制。

故事的道德:避免猜测编码是如何工作的,而是转到主要来源,这里是教程,看看如何做正确的。

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;    
import javax.swing.*;

@SuppressWarnings("serial")
public class MyDraw extends JPanel {

    private static final Color RECT_COLOR = new Color(100, 200, 0);
    private int larg;
    private int lung;

    public MyDraw(int larg, int lung) {
        this.larg = larg;
        this.lung = lung;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(RECT_COLOR);
        g.fillRect(0, 0, larg, lung);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(larg, lung);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("MyDraw");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        int larg = 512;
        int lung = 512;
        frame.getContentPane().add(new MyDraw(larg, lung));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

Swing Painting教程:Lesson: Performing Custom Painting