repaint() - 组件不会出现在简单的展示中

repaint() - component doesn't appear for a simple show

我正在尝试编写黑白棋,并且...我已经被基本视图所困。

我的主要class:

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

还有我的JPanelclass:

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 小时,none 我发现的解决方案有效。

这是你的问题:

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

WIDTH 和 HEIGHT 值不是您期望的值,实际上它们可能都是 0。为了最安全的编程,您需要通过 getWidth()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());
    }
}

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。在 Grid 构造函数中调用 setBackground(new Color(0, 128, 0)); 将设置它。当然,如果您要绘制其他东西,您可能需要 paintComponent——但如果它是网格,请考虑使用 JLabel 网格并设置它们的图标。