Апплеты и массивы (отображение кнопок)

Во-первых, работая над этим проектом, мне нужно реализовать JApplet размером 600x600 пикселей, который представляет собой сетку 10x10 (с горизонтальным и вертикальным промежутком в 4 пикселя) из 100 JButton. Программа запускается со скрытыми всеми кнопками, кроме одной, и некоторые кнопки открываются при каждом нажатии кнопки. Каждый щелчок также вызывает изменение цвета фона и названия кнопки. Когда все кнопки открыты, цвет фона меняется на черный и остается черным, пока пользователь не закроет апплет.

Кнопки должны быть сохранены в массиве 10x10 типа JButton. Кнопки имеют метку из 2-значного числа, которое содержит номер строки и столбца, то есть кнопка в верхнем левом углу в нулевой строке нулевого столбца помечена как 00.

Выберите 5 цветов (кроме черного), которые вы хотите использовать для своего фона.

Когда апплет запущен, фон имеет нейтральный цвет, и видна только кнопка 00.

У меня возникли проблемы с отображением 100 кнопок от 00 до 99 в сетке 10x10. Я чувствую, что мои циклы for могут быть неправильными, и поэтому кнопки не создаются должным образом:

public class Project5 extends JApplet implements ActionListener {

    JButton button;
    Container contentPane;

    public void init() {

        setSize(600, 600);
        contentPane = getContentPane();
        contentPane.setBackground(Color.WHITE);

        GridLayout grid = new GridLayout(10,10);
        grid.setVgap(4);

        JButton[][] btns = new JButton[10][10];

        for (int i = 0; i < 10; i++) {

            for (int j = 0; j < 10; j++) {

                button = new JButton();
                button.addActionListener(this);
                contentPane.add(button);
                button.setVisible(true);

            }
        }

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Container contentPane = getContentPane();
        button.setVisible(false);

        int clicks = 0;
        clicks++;

        if (clicks % 5 == 0) {
            contentPane.setBackground(Color.PINK);
        } else if (clicks % 5 == 1) {
            contentPane.setBackground(Color.GREEN);
        } else if (clicks % 5 == 2) {
            contentPane.setBackground(Color.BLUE);
        } else if (clicks % 5 == 3) {
            contentPane.setBackground(Color.YELLOW);
        } else if (clicks % 5 == 4) {
            contentPane.setBackground(Color.RED);
        }

    }

    public void checkDone() {
        //if all buttons visible, change contentPane color to black.

    }

}

person user3597420    schedule 02.05.2014    source источник


Ответы (1)


Вы создаете диспетчер макета, GridLayout, но никогда не используете его для настройки макетов ваших компонентов. Вы должны это сделать, позвонить setLayout(...) и передать своего менеджера. В противном случае ваша contentPane будет использовать BorderLayout по умолчанию, и когда компонент добавляется в BorderLayout с использованием контейнера по умолчанию, он перекрывает любые другие компоненты, добавленные таким же образом. В конце концов отображается только последний добавленный компонент.


Изменить: другие проблемы

Здесь:

Container contentPane = getContentPane();
button.setVisible(false);

Вы используете переменную кнопки и делаете ее невидимой, но какую кнопку вы имеете в виду? Тот, что нажал? Это уж точно не так. Если это тот, который вам нужен, вы должны вызвать getSource() для вашего параметра ActionEvent, например.

А затем следующая строка вниз:

int clicks = 0;
clicks++;

Это гарантирует, что количество кликов всегда будет равно 1 и ничего кроме 1. Не очень полезно.


Кроме того, вы создаете массив JButtons, btns, но ничего не делаете с ним.

person Hovercraft Full Of Eels    schedule 02.05.2014
comment
Спасибо, я вижу, в чем проблема - person user3597420; 02.05.2014