예, 숙제입니다. 예, 저는 완전히 붙어 있습니다.스윙, 자바 및 멀티 스레딩 및 채색 단추
다음은 요지입니다. JFrame을 만들었습니다. 3 개의 패널 (상단, 중간, 하단)이 있습니다. 하단 패널에는 Red, Green 및 Blue라는 3 개의 버튼이 있습니다. 상단 패널에는 각각의 버튼을 클릭 한 횟수를 알려주는 3 개의 텍스트 필드가 있습니다. 허용되는 최대 값은 각 버튼 당 10입니다. 가운데 패널에는 0에서 63까지 번호가 매겨지는 8 x 8 격자의 Jbutton이 있습니다. 지금까지는 그렇게 좋았습니다.
버튼을 클릭 할 때마다 스레드가 시작됩니다. 아무 스레드도 죽지 않습니다. 스레드가 시작되면 0에서 63까지의 숫자가 무작위로 선택됩니다. 해당 숫자에 해당하는 JButton은 클릭 된 색상으로 채색됩니다. 빨간색 버튼을 클릭하면 흰색 배경의 상자가 빨간색으로 변합니다. 그러나 그 JButton의 색은 흰색이 될 때까지 희미 해지기 시작합니다. 과정은 약 8 초 걸립니다.
작성한 스레드는 스윙 구성 요소에 액세스 할 수 없어야합니다. 오히려 데이터 구조를 유지하고 실행주기에 따라 스레드별로 업데이트해야합니다. 반면에 주기적으로 주 스레드에서 repaint() 메소드를 호출하여 Swing Event Dispatcher 스레드를 초대하여 데이터 구조의 내용을 방문하고 그에 따라 GUI 구성 요소를 표시하십시오.
........ 나는 모든 객체를 생성하고 표시했습니다. 버튼을 10 회 이상 클릭 할 수 없습니다. 다음은 내가있는 곳입니다.
두 개의 배열이 있습니다. 하나는 크기가 64 인 문자열 배열이고, 두 개는 버튼을 나타냅니다. 또한 int 배열이 있습니다. 이것은 쓰레드가 생성 된 순서를 알기 위해서입니다. 단추를 클릭 할 때마다 스레드를 만들었고 스레드를 시작했습니다. 나는 즉시 바로 잠금 부분의 외부 꺼집니다 타이머 개체를 사용하여 우리가 그것을 적용하지 않은 경우에도
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;
}
}
}
}
}
을 시도했다 다음은 스레드에 대한 내 실행 방법입니다. 이 메소드는 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 메서드는 이벤트 발송 스레드에서 처리합니다. (위의 코드는 빨간색 스레드에만 해당하는 것으로, 흰색이 될 때까지 녹색과 파란색을 약간 증가시켜 색상을 희미하게 만드는 것이 좋습니다.) 문제 : 빨간색 버튼을 클릭하면 아무 버튼도 색상이 변하지 않습니다. (예, 적절한 등록이 끝났습니다.) 많은 스레드가있는 상태에서 타이밍을 제어하는 방법을 알지 못합니다. 여기에도 올바른 길을 가고 있습니까?
숙제 인 경우 '숙제'태그를 넣으십시오. – Tudor
더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/) – mKorbel
으로 질문을 수정하십시오. 문제가 무엇인지 더 자세히 설명해주십시오. 버튼 색상 변경은 표시되지 않지만 actionPerformed의 텍스트 출력이 표시됩니까? – toto2