repaint () - компонент не появляется для простого шоу - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь закодировать Отелло, и ... я уже застрял с базовым представлением.

Мой основной класс:

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 голосов
/ 01 ноября 2018

Это ваша проблема:

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

Значения WIDTH и HEIGHT не соответствуют ожидаемым, и на самом деле они, вероятно, равны 0. Вместо этого для наиболее безопасного программирования необходимо получить фактическую ширину и высоту с помощью getWidth() и getHeight()* 1006. *

Нет необходимости в этих 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, если все, что вы делаете, это заполняете фон. Вызов setBackground(new Color(0, 128, 0)); в конструкторе Grid установит его. Конечно, вам может понадобиться paintComponent, если вы собираетесь рисовать другие вещи, но если это сетка, рассмотрите возможность использования сетки JLabels и установки их значков.

...