Проблема в том, что вы пытаетесь контролировать размер кадра. Это не то, как работает Swing. Помните, что размер кадра включает заголовок и границы. Таким образом, размер панели, добавляемой к кадру, НИКОГДА не будет соответствовать размеру рамки.
Вместо этого вы контролируете размер компонентов, добавляемых в рамку. Тогда размер кадра будет соответствующим образом основан на этих компонентах.
static int windowWidth = 580;
static int cellSize = windowWidth / 9;
Зачем вам выбирать ширину 580. Как вы получите равные размеры ячеек, поскольку 9 не делится поровну на 580?
Поэтому вместо этого следует указать ваш размер клетки. Затем на панели умножьте на 9, чтобы получить предпочтительный размер панели.
Rect rect = new Rect(20, 20, windowWidth - 20, windowHeight - 20, Color.black);
Кроме того, не задавайте значение 20 жестко в 4 разных местах. Опять же, у вас может быть параметр для строки класса "borderSize". Затем внутренне вы используете это значение.
Таким образом, параметры вашего класса Rect могут выглядеть примерно так: publi c Rect (int cellSize, int borderSize, Color _color) Теперь вам нужно реализовать метод getPreferredSize()
из вас класс, так что компонент может рассчитать свой собственный предпочтительный размер. Что-то вроде:
@Override
public Dimension getPreferredSize()
{
int size = (cellSize * 9) + (borderSize * 2);
return new Dimension(size, size);
}
Теперь, когда вы делаете свою обычную окраску, все рисование выполняется относительно панели. Что-то вроде:
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int size = (cellSize * 9);
g2d.drawRect(borderSize, borderSize, size, size);
g2d.setColor(color);
}
Поэтому, когда вы создаете экземпляр класса, вы будете использовать:
public void createFrame()
{
Rect rect = new Rect(50, 20, Color.black);
frame = new JFrame("Sudoku");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(rect);
frame.pack();
//frame.setSize(windowWidth, windowHeight);
frame.setVisible(true);
}