Swing, Java и многопоточность, а также кнопки раскраски - PullRequest
2 голосов
/ 29 февраля 2012

Да, это домашнее задание. Да, я полностью застрял.

Вот суть. Я создал JFrame. Есть 3 панели (верхняя, средняя, ​​нижняя). На нижней панели расположены 3 кнопки: Красная, Зеленая и Синяя. В верхней панели находятся 3 текстовых поля, которые показывают количество нажатий на соответствующую кнопку. Максимально допустимое значение - 10 для каждой кнопки. В средней панели находится сетка кнопок J 8 x 8 с номерами от 0 до 63. Пока все хорошо.

Каждый раз, когда мы нажимаем кнопку, начинается цепочка. Никакой поток не умирает Когда начинается поток, случайным образом выбирается число от 0 до 63. JButton, соответствующий этому номеру, окрашивается в цвет, по которому щелкнули. Поэтому, если щелкнуть красную кнопку, мы должны увидеть поле с белым фоном, которое станет красным. Но затем цвет этого JButton начинает исчезать, пока не станет белым. Процесс должен занять около 8 секунд.

Создаваемые вами потоки не должны иметь доступа ни к каким компонентам Swing. Скорее, необходимо поддерживать структуру данных и обновлять потоки в соответствии с их циклом выполнения. С другой стороны, периодически вызывайте методы repaint () из основного потока, чтобы пригласить поток Swing Event Dispatcher, чтобы в конечном итоге посетить содержимое структуры данных и соответствующим образом отобразить компоненты GUI.

........ Я получил все объекты, созданные и отображенные. Вы не можете нажать более 10 раз на кнопку. Вот где я нахожусь:

У меня есть два массива: один представляет собой массив строк размером 64. Они представляют кнопки. У меня также есть массив целых. Это так, что я знаю порядок, в котором были созданы темы. Я создал темы при нажатии кнопки, и я запустил их. Вот мой метод запуска потоков:

public void run() {
    Random num = new Random(new Date().getTime());
    while (true) {
        Thread j = Thread.currentThread();
        int randInt = num.nextInt(64);
        synchronized (lock) {

            if ((array[randInt].compareTo("red") == 0
                 || array[randInt].compareTo("blue")
                 == 0 || array[randInt].compareTo("green") == 0))
            {
                randInt = num.nextInt(64);
            }
            for (int k = 0; k < 10; k++) {
                if (threadarray[k] == -1) {
                    threadarray[k] = randInt;
                    break;
                }
            }

        }
    }
}

Несмотря на то, что мы не рассмотрели его, я попытался использовать объект Timer, который сразу же выходит прямо за пределы секции блокировки. Это приводит меня к методу actionPerformed. Я добавил все соответствующие регистрации.

public void actionPerformed(ActionEvent arg0) {
    for (int i = 0; i < threadarray.length; i++) {

        int num = threadarray[i];
        if (num != -1) {
            System.out.println(num);
            String s = array[num];
            System.out.println(s + "is ");
            if (s.compareTo("red") == 0) {
                button[num].setOpaque(true);
                button[num].setBackground(Color.red);
                while (button[num].getBackground() != Color.white) {
                    System.out.println("not white yet");
                    int g = button[num].getBackground().getGreen();
                    int b = button[num].getBackground().getBlue();
                    if (255 - (g + 1) >= 0) {
                        Color c = new Color(255, g + 1, b + 1, 1);
                        button[num].setOpaque(true);
                        button[num].setBackground(c);
                        System.out.println(c + " " + " c is");
                    } else {
                        button[num].setBackground(Color.white);
                    }
                }
            }

            System.out.println(i + " i is " + button[num].getBackground()); //just some debugging info
            threadarray[i] = -1;   //clear the thread array
            array[num] = "0"; //clear the string array

        }
    }
}

Метод actionPerformed обрабатывается потоком отправки событий. (Обратите внимание, что приведенный выше код предназначен только для красных нитей. Идея состоит в том, чтобы выцветать, постепенно увеличивая зеленый и синий цвета, пока он не станет белым.

Проблемы: ни одна кнопка никогда не меняет цвет, когда я нажимаю красную кнопку внизу (да, соответствующая регистрация была сделана.) Я также не знаю, как управлять синхронизацией с множеством идущих потоков. Я даже иду по правильной дороге здесь?

1 Ответ

2 голосов
/ 29 февраля 2012

Не выдавая слишком много, этот пример иллюстрирует способ работы с цветом и кнопками, которые игнорируют setBackground().Примеры здесь и здесь демонстрируют, как исчезать цвета.Поскольку оба полагаются на поток javax.swing.Timer, ни одно из них не является решением, но методы могут оказаться полезными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...