Да, это домашнее задание. Да, я полностью застрял.
Вот суть. Я создал 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 обрабатывается потоком отправки событий. (Обратите внимание, что приведенный выше код предназначен только для красных нитей. Идея состоит в том, чтобы выцветать, постепенно увеличивая зеленый и синий цвета, пока он не станет белым.
Проблемы: ни одна кнопка никогда не меняет цвет, когда я нажимаю красную кнопку внизу (да, соответствующая регистрация была сделана.) Я также не знаю, как управлять синхронизацией с множеством идущих потоков. Я даже иду по правильной дороге здесь?