Почему не отображаются элементы JButton в JFrame на java swing

190
17 апреля 2018, 05:24

Написал следующий код:

public class GUI extends JFrame {
    GUI() {
        super("Кнопки");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300,400);
        setVisible(true);
        setResizable(false);
        JButton buttons[] = new JButton[9];//Создаю массив из 9 кнопок
        JPanel panel = new JPanel();//Создаю панель на которую буду размещать кнопки
        panel.setLayout(null);//Говорю что не буду использовать менеджер размещений и задам координа в ручную
        int x = 30, y = 30; // Начальные координаты первой кнопки
        int wide = 20, height = 20;//Размер кнопки
        for (int i = 0; i < 10;) {//Пробегаем массив кнопок
            for (int j = 0; j < 3 && i < 9; j++) {//формируем "матрицу"
                buttons[i] = new JButton(""+ i);//Создание I-той кнопки
                buttons[i].setSize(wide,height);//Задаем I-той кнопке размер
                buttons[i].setLocation(x,y);//Задаем I-той кнопке координаты
                panel.add(buttons[i]);//Добавляем I-тую кнопку на панель
                y += 30; //Задаем смещение строки по У
                i++;//переходим к следующей кнопке
            }
            x += 30;//Задаем смещение столбца по Х
            y = 30;//Возвращаем строку на начало
        }
        setContentPane(panel);//Устанавливаем панель в качестве контента окна
    }
}

И в итоге должна вывестись "матрица" из 9 кнопок 3 на 3. Но вместо этого нечего не отрисовывается.

Answer 1

Вот этот метод "setVisible(true);" должен вызываться последним, то есть после формирования JFrame.
Для это Вам можно добавить метод main в Ваш класс:

    public static void main(String[] args) {
        GUI gui = new GUI();
        gui.setVisible(true);
    }

После того, как вы перенесете этот метод, Вы увидите, что у Вас вообще все перестало отображаться, а причина кроется в Вашем "бесконечном цикле", например у меня x достиг уже -1600063728.

Добавьте условие при котором Вам необходимо выйти из первого for:

    x += 30;//Задаем смещение столбца по Х
    y = 30;//Возвращаем строку на начало
    if (i + 1 == 10) {
        break;
    }

Если же Вы не хотите выносить вызов метода вне конструктора, переместите его вниз:

    import javax.swing.*;
    public class GUI extends JFrame {
        GUI() {
            super("Кнопки");
            setSize(300, 400);
            setResizable(false);
            JButton buttons[] = new JButton[9];//Создаю массив из 9 кнопок
            JPanel panel = new JPanel();//Создаю панель на которую буду размещать кнопки
            panel.setLayout(null);//Говорю что не буду использовать менеджер размещений и задам координа в ручную
            int x = 30, y = 30; // Начальные координаты первой кнопки
            int wide = 20, height = 20;//Размер кнопки
            for (int i = 0; i < 10; ) {//Пробегаем массив кнопок
                for (int j = 0; j < 3 && i < 9; j++) {//формируем "матрицу"
                    buttons[i] = new JButton("" + i);//Создание I-той кнопки
                    buttons[i].setSize(wide, height);//Задаем I-той кнопке размер
                    buttons[i].setLocation(x, y);//Задаем I-той кнопке координаты
                    panel.add(buttons[i]);//Добавляем I-тую кнопку на панель
                    y += 30; //Задаем смещение строки по У
                    i++;//переходим к следующей кнопке
                }
                x += 30;//Задаем смещение столбца по Х
                y = 30;//Возвращаем строку на начало
                if (i + 1 == 10) {
                    break;
                }
            }
            add(panel);//Устанавливаем панель в качестве контента окна
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);
        }
        public static void main(String[] args) {
            new GUI();
        }
    }
READ ALSO
Объясните логику работы выражения

Объясните логику работы выражения

Объясните пожалуйста, как работает это выражение !(a & (a - 1)) В плюсах совершенно не понимаю, в Java ! нельзя применять к int

154
Как печатать с помощью Java(принтер)

Как печатать с помощью Java(принтер)

Есть массив byte(byte[] array) - в этом массиве находится уже готовый PDF файлТ

197
Создание визуального редактора на Java

Создание визуального редактора на Java

Пытаюсь создать визуальный редактор, где будет возможность перемещать и изменять размеры элементов (что-то вроде упрощенного варианта Scene Builder)В...

177
Отличия процесса и потока

Отличия процесса и потока

Стандартный вопрос практически на каждом собеседовании по Java

194