2012-02-29 3 views
2

예, 숙제입니다. 예, 저는 완전히 붙어 있습니다.스윙, 자바 및 멀티 스레딩 및 채색 단추

다음은 요지입니다. 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 메서드는 이벤트 발송 스레드에서 처리합니다. (위의 코드는 빨간색 스레드에만 해당하는 것으로, 흰색이 될 때까지 녹색과 파란색을 약간 증가시켜 색상을 희미하게 만드는 것이 좋습니다.) 문제 : 빨간색 버튼을 클릭하면 아무 버튼도 색상이 변하지 않습니다. (예, 적절한 등록이 끝났습니다.) 많은 스레드가있는 상태에서 타이밍을 제어하는 ​​방법을 알지 못합니다. 여기에도 올바른 길을 가고 있습니까?

+0

숙제 인 경우 '숙제'태그를 넣으십시오. – Tudor

+2

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/) – mKorbel

+2

으로 질문을 수정하십시오. 문제가 무엇인지 더 자세히 설명해주십시오. 버튼 색상 변경은 표시되지 않지만 actionPerformed의 텍스트 출력이 표시됩니까? – toto2

답변

2

examplesetBackground()을 무시하는 색상 및 버튼을 처리하는 방법을 보여줍니다. 예제 herehere은 색상을 희미하게하는 방법을 보여줍니다. 둘 다 javax.swing.Timer 스레드를 사용하므로 둘 다 해결되지 않습니다. 그러나 기술은 유용 할 수 있습니다.