Я новичок в Java.
Прежде всего, имена классов ДОЛЖНЫ начинаться с символа верхнего регистра. Вы когда-нибудь видели в JDK класс, который не начинается с символа верхнего регистра? Учитесь на примерах из кода в учебнике или учебнике.
Есть ли какое-либо решение, которое показывает один и тот же результат каждый раз при выполнении кода?
Все компоненты должны быть добавляется в рамку ДО того, как рамка становится видимой.
Когда фрейм становится видимым, вызывается менеджер компоновки, и компонентам присваивается размер / местоположение. Если вы добавляете компоненты на видимую панель, вам нужно вызвать revalidate()
и repaint()
на панели, чтобы убедиться, что менеджер компоновки вызван.
Должен признать, я не уверен, почему вы получаете это случайное поведение. Некоторые компоненты получают размер / расположение, а другие нет, даже если диспетчер компоновки не вызывается.
Я бы посоветовал вам изменить структуру кода примерно так:
JPanel chessboard = new JPanel( new GridLayout(8, 8, 1, 1) );
// add buttons to the panel
JFrame frame = new JFrame("CHESS")
frame.add(chessboard, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
Другие комментарии:
- Не устанавливать размер кадра. Использование 800 x 800 не сделает каждую кнопку 100 x 100. Размер рамки также включает строку заголовка и границы, поэтому размер каждой кнопки будет меньше, чем вы ожидаете.
Вместо этого вы можете создать переменную вне ваших циклов:
Dimension buttonSize = new Dimension(100, 100)
Затем, когда вы создаете кнопку, вы используете:
button.setPreferredSize( buttonSize );
Теперь при упаковке () вызывается, размер кадра будет соответствовать предпочтительному размеру всех компонентов, добавленных в кадр.
Все компоненты Swing должны быть созданы на Event Dispatch Thread (EDT)
. Прочтите раздел из учебника Swing How to Make Frames . Код FrameDemo.java
показывает вам один из способов структурирования вашего класса так, чтобы метод invokeLater(…)
использовался для обеспечения выполнения кода на EDT.
Не делайте ваши переменные статичными. c. Это указывает на неправильный дизайн класса. Посмотрите пример MenuLook.java
из Как использовать меню для немного другого дизайна, где ваш ChessBoard
становится компонентом, созданным в другом классе. Затем вы можете определить переменные экземпляра в этом классе.