java GUI ошибка отображения вывода нескольких кнопок? - PullRequest
0 голосов
/ 30 мая 2020

Я новичок в Java. Это мой первый проект. GUI кода продолжает меняться каждый раз, когда я запускаю код. Иногда вывод даже не загружается полностью. Это код для инициализации шахматной доски 8x8 jbuttons.

Я оставил изображения, проверяйте гиперссылки ниже.

Есть ли какое-либо решение, которое показывает один и тот же результат каждый раз, когда код выполняет?

    package chess;
    import game.*;
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import java.util.*;

    public class board{
    static JButton [][] spots =new  JButton [8][8];
    public static void main(String[] args){
    board b =new board();
    b.initializeboard(spots);
    }


    public void initializeboard(JButton [][] spots){
    JFrame f = new JFrame("CHESS");
    f.setVisible(true);
    f.setSize(800,800);

    GridLayout layout =new GridLayout(8,8,1,1); 
    f.setLayout(layout);

    for(int ver=0;ver<8;ver++){
      for(int hor=0;hor<8;hor++){
           JButton button = new JButton();
           if((ver+hor)%2==0){
                    button.setBackground(Color.WHITE); }
           else{
                    button.setBackground(new Color(255,205,51)); }
           pieces p =new pieces();
           spots[ver][hor] = button;
           p.setButton(button);
           f.add(button);
           }
              }
                  } //initialize board
                       }  // close board

Неправильное выполнение

Правильное выполнение

Неполное выполнение

1 Ответ

1 голос
/ 30 мая 2020

Я новичок в 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 );

Другие комментарии:

  1. Не устанавливать размер кадра. Использование 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 становится компонентом, созданным в другом классе. Затем вы можете определить переменные экземпляра в этом классе.

...