2016-07-11 5 views
1

나는 이것이 질문과 같은 질문을하고 몇 시간 동안 스택 오버 플로우를 통해 빗질 후에도 문제를 해결할 수 없었던 것처럼 보입니다. 미안 해요. 내가 명백한 것을 놓친다면.어떻게 최종 문자열없이 다른 스레드를 통해 JLabel을 변경할 수 있습니까?

스레드가 시작될 때마다 jLable의 텍스트를 변경해야하며 스레드가 완료 될 때 다시 변경해야합니다. 간단히 말해 현재 실행중인 스레드의 수를 표시하려고합니다.

jobQueueView은 정적이며 최종 jLabel입니다. Main은 jLabel을 가진 jFrame입니다. jobQueue은 정적 int입니다. 각 스레드의 끝에서

jobQueue += 1; refreshQueue(); 

:

각 스레드의 시작에서

jobQueue -= 1;refreshQueue(); 

그리고 마지막으로

public void refreshQueue() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Main().jobQueueView.setText(Integer.toString(jobQueue)); 
      } 
     }); 

    } 

이 작동하지 않습니다. 어떤 아이디어? 감사합니다

편집 : 버튼 클릭 이벤트

Can I change the text of a label from a Thread in Java?에 : 앤드류 톰슨 Swing JLabel text change on the running application의 지시에 따라, 문자열이 최종 확인한다. 안돼.

Update JLabel from another thread는 : 타이머, 내가 스레드 수

JLabel on JPanel doesn't update when setText from another method을 필요로 사용 : 주어진 솔루션을 시도했다. did not work

Thread and JLabel in Swing- Not working properly : 버튼 클릭 수가 많지만 솔루션이 다릅니다. 아직 didnt 한 일

+0

http://stackoverflow.com/questions/6578205/swing-jlabel-text- 스레드

jobQueue += 1; refreshQueue(jobQueue); 

의 시작에서 그리고 그것의 끝에

public void refreshQueue(int jobQueue) { final int jobQueueCount = jobQueue; EventQueue.invokeLater(new Runnable() { @Override public void run() { Main.jobQueueView.setText(Integer.toString(jobQueueCount)); } }); } 

실행 중 응용 프로그램 변경 : 버튼 클릭 이벤트 http://stackoverflow.com/questions/26495337/can-i-change-the-text-of-a-label-from-a-thread -in-java : 문자열을 final로 만들어야합니다. 안돼. http://stackoverflow.com/questions/5895481/update-jlabel-from-another-thread?rq=1 : 타이머를 사용합니다. 스레드 수를 계산해야합니다. @Andrew Thompson 이들은 지금 내가 열어 본 것들이지만 나는 더 많은 것을 시도했다 –

+0

@ AndrewThompson 5 of 5. 당신의 도움에 감사합니다 –

+0

* "5 of 5."* 좋은 질문입니다. .. 미안해, 나는 그 해답을 모르지만, 지금은 정보가 잘하면. 가 포함되어 있다면 ** 답할 수있는 사람들에게 그렇게 할 수있는 상황을 제공 할 수 있습니다. –

답변

2

매번 새로운 프레임을 만드는 것처럼 보입니다.

새 Main(). jobQueueView.setText (Integer.toString (jobQueueCount)));

그래서 여러 개의 프레임이 있지만 하나의 정적 라벨이 있습니다. 이로 인해 문제가 발생할 수 있습니다. 아래와 같이 정적 인 방법을 통해 jobQueueView에 액세스하십시오.

Main.jobQueueView.setText (정수.toString (jobQueueCount));

+0

OP마다 "jobQueueView는 정적이고 최종 jLabel입니다."그래서 Main의 얼마나 많은 인스턴스가 여전히 'jobQueueView'를 만들지, 올바르게 업데이트 될 것입니다. – Sanjeev

+0

단일 레이블을 단일 상위 컨테이너에만 추가 할 수 있지만 정적 방법으로 사용해야한다는 것에 동의합니다. 이로 인해 업데이트 문제가 발생할 수 있습니다. OP가 전체 코드를 게시하는 경우에만 명확해질 수있는 – mfidan

+0

. 거기에는 생성자와 별도로 호출되는 init 메소드가있을 수 있으며 jlabel은 한 번만 추가되었습니다. – Sanjeev

1

그래서 문제는, 오직 마지막 변수는 코드가 작동

public void refreshQueue(int jobQueue) { 
     final int jobQueueCount = jobQueue; 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Main().jobQueueView.setText(Integer.toString(jobQueueCount)); 
      } 
     }); 

    } 

을 그리고

하여 사용하는 외부 클래스

그래서 순서에서 익명의 내부 클래스에 액세스 할 수있다

jobQueue += 1; refreshQueue(jobQueue); 

그리고

jobQueue -= 1; refreshQueue(jobQueue); 

희망이 도움이됩니다.

+0

코드가 컴파일되지 않는다고해도 문제가 발생하면 – mfidan

+0

사실입니다. 익명의 내부 클래스에서 외부 클래스의 최종 멤버가 아닌 멤버는 사용할 수 없습니다. – Sanjeev

+0

네, 맞습니다. 문제는 아닙니다. – mfidan

0

주어진 두 가지 답변으로 문제가 해결되었습니다. 여기에 최종 코드가 있습니다.

jobQueue -= 1; refreshQueue(jobQueue); 
관련 문제