2012-12-12 3 views
0

javaSpace에서 가져 오는 클라이언트 창이 생성됩니다. 사용중인 코드입니다.jFrame 초기화 문제

/** 
* Create the frame. 
*/ 
public Client() 
{ 
    space = SpaceUtils.getSpace(); 
    if (space == null) 
    { 
     System.err.println("Failed to find the javaspace"); 
     System.exit(1); 
    } 

    initFrame(); 
    setVisible(true); 
    processPrintJobs(); 
} 

이 창은 initFrame() 내부에서 생성됩니다. processPrintJobs는 새 메시지가 있는지 확인합니다. processPrintJobs() 메서드 호출을 주석 처리하면 윈도우가 올바르게 그려 지지만 메서드 호출이 있으면 윈도우는 빈 사각형 만 표시합니다.

while 루프가 실행되기 전에 창을 생성 할 때 프로세스가 여러 번 검사되어 프로세스가 제대로 수행되지 않아 창의성이 제대로 작성되지 않는 것과 같습니다.

public void processPrintJobs() 
{ 

    while (true) 
    { 
     try 
     { 
      Message template = new Message(); 

      if (channel == null) 
      { 
       System.out.println("No channel given"); 
      } else 
      { 
       template.Channel = channel; 
       // System.out.println(channel); 
       template.position = new Integer(getNumber() + 1); 

       Message msg = (Message) space.read(template, null, 
         Long.MAX_VALUE); 

       messageList.append(msg.execute()); 
      } 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

답변

2

java.awt.EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     processPrintJobs(); 
    } 
} 

그러나 일반적으로 사용

, 응용 프로그램의 아키텍처는 몇 가지 측면이 없습니다.

스레드 또는 이와 유사합니다.


더보기 :

당신은 예를 들어 하나 개의 작업마다 틱, 스윙 타이머를 사용할 수 있습니다.

import javax.swing.Timer; 

클라이언트 생성자의 끝에 호출해야합니다. 이름 구성된 나머지 부분

Timer printJobsTimer = new Timer(100, new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 

      // Process a print job: 

      if (channel != null) { 
       Message template = new Message(); 
       template.Channel = channel; 
       template.position = new Integer(getNumber() + 1); 

       Message msg = (Message) space.read(template, null, 
         Long.MAX_VALUE); 

       messageList.append(msg.execute()); 
      } 
     } 
    }); 
    printJobsTimer.setInitialDelay(100); 
    printJobsTimer.start(); 

는 멋 졌을 것이다 : 단지 클래스 이름은 소문자와 대문자 및 다른 이름으로 시작.

+0

어떻게 구현 될까요? 어떻게 호출됩니까? – user1725794

+0

이것은 전체 클래스의 코드입니다. http://pastebin.com/sPcTC3kp – user1725794

+0

좋아, 확장 내 대답; 기본적으로 위험한 while-loop를 제거합니다. –

3

while이 무한 루프는 EDT을 차단한다. 단순히 JFrame 즉시 페인트되는 것은 아닙니다

setVisible(true); 

를 호출

while (true) 

. 수명이 긴 프로세스는 SwingWorker으로 처리해야합니다.