repaint()-组件未显示用于简单显示

时间:2018-10-31 22:11:55

标签: java swing graphics paintcomponent repaint

我正在尝试编写Othello的代码,并且...我已经陷于基本视图了。

我的主班:

public class Othello extends JFrame {
    private static final long serialVersionUID = 1L;

    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;

    private Grid grid;

    public Othello() {
        this.setSize(WIDTH, HEIGHT);
        this.setTitle("Othello");

        this.grid = new Grid();

        this.setContentPane(this.grid);

        this.grid.revalidate();
        this.grid.repaint();
    }

    public void run() {
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new Othello().run();
    }
}

还有我的JPanel类:

public class Grid extends JPanel {
    private static final long serialVersionUID = 1L;

    public Grid() {}

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(new Color(0,128,0));
        g.fillRect(0, 0, WIDTH, HEIGHT);
    }
}

我不明白为什么它什么都不显示。

paintComponent被调用了,但是什么也没发生,我试图在几乎所有地方都调用revalidate()repaint(),并且没有任何效果。

我已经在不同主题中寻找解决方案近1个小时了,但我发现所有解决方案都没有用。

1 个答案:

答案 0 :(得分:3)

这是您的问题:

g.fillRect(0, 0, WIDTH, HEIGHT);

WIDTH和HEIGHT值不是您期望的值,实际上它们都可能为0。为了最安全的编程,您需要通过getWidth()和{{1 }}

不需要这些getHeight()revalidate()。例如:

repaint()

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.*;

public class GridTest {

    private static final int WIDTH = 800;
    private static final int HEIGHT = 600;

    private static void createAndShowGui() {

        Grid mainPanel = new Grid(WIDTH, HEIGHT);

        JFrame frame = new JFrame("Grid Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

如果您要做的只是填充背景,那么实际上就不需要覆盖paintComponent了。在Grid构造函数中调用class Grid extends JPanel { private static final long serialVersionUID = 1L; private int prefW; private int prefH; public Grid(int prefW, int prefH) { this.prefW = prefW; this.prefH = prefH; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(new Color(0,128,0)); g.fillRect(0, 0, getWidth(), getHeight()); } @Override public Dimension getPreferredSize() { if (isPreferredSizeSet()) { return super.getPreferredSize(); } return new Dimension(prefW, prefH); } } 将对其进行设置。当然,如果要绘制其他内容,则可能需要paintComponent;但是,如果它是网格,请考虑使用JLabel网格并设置其图标。