Это ваша проблема:
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 и установки их значков.