2013-07-24 4 views
1

로더, MyDialog 및 TEST (main 메서드 사용) 3 개의 clasess가 있습니다. (코드는 아래 참조)JDialog의 다른 동작은 프로그램 및 사용자 작업에 의해 만들어 질 때

내가 원하는 것은 JLabel과 JProgressBar가있는 간단한 대화 상자를 만드는 것입니다. JLabel과 JProgressBar를 사용하면 MyDialog를 표시하는 데 걸리는 시간을 사용자에게 알려줍니다. MyDialog는 Jdialog이며 생성자에서 시간이 많이 소요되는 작업 (데이터베이스에서 데이터로드 등).

아래 코드는 모델 상황입니다. "MyDialog"가 main (상수 BY_USER가 false 임)에 의해 생성 될 때, 정확하게 작동하는 모든 것은 원합니다. 하지만 버튼으로 대화 상자를 만들 때 버튼 누름 (상수 BY_USER가 참)을 수행 한 후 MyDialog의 인스턴스가 만들어지면 로더는 빈 흰색 형태입니다. 완료되지 않은 것 같습니다.

로더는 스레드를 확장하므로이 문제는 스레딩 (이벤트 발송 스레드)에 있다고 생각합니까? 나는 무엇이 잘못되었고 어떻게 고쳐야하는지 모른다. 도와주세요.

내 영어를 사용해 주셔서 감사합니다.

CLASS 테스트 :

package test; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class TEST { 
public static final boolean BY_USER = false; 

public static void main(String[] args) { 
    if (BY_USER) { 
     JFrame mainDialog = new JFrame("Main"); 

     JButton show = new JButton("Show MyDialog"); 
     show.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       MyDialog dialog = new MyDialog(); 
      } 
     }); 
     mainDialog.add(show); 
     mainDialog.setLocationRelativeTo(null); 
     mainDialog.setMinimumSize(new Dimension(160, 80)); 
     mainDialog.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     mainDialog.setVisible(true); 
    } else { 
     MyDialog dialog = new MyDialog(); 
    } 
} 
} 

의 클래스 MyDialog에 : 패키지 테스트;

import javax.swing.JFrame; 
import javax.swing.WindowConstants; 


public class MyDialog extends JFrame{ 

public MyDialog() { 
    super(); 

    // making loader with title, first message and count of steps of operation 
    Loader loader = new Loader("Loader", "First showed message", 100); 
    loader.ShowLoader(); 

    // time-consuming operation (loading data from database etc.). 
    // for clarity replaced with for statement 

    int j=0; 
    for(int i=0; i<Integer.MAX_VALUE; i++) 
    { 
     j++;   
     if(j==Integer.MAX_VALUE/100){ 
      // updating loader message and progress bar value 
      loader.NewAction(Integer.MAX_VALUE - i+""); 
      j=0; 
     } 
    } 

    // closing loader 
    loader.DestroyLoader(); 

    this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    this.setSize(300, 300); 
    this.setLocationRelativeTo(null); 
    this.setVisible(true); 
} 
} 

클래스 로더 :

package test; 
import java.awt.BorderLayout; 
import java.awt.Dialog; 
import java.awt.Dimension; 
import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingConstants; 

public class Loader extends Thread{ 
    private JDialog dialog; 
    private JLabel message = new JLabel("", SwingConstants.CENTER); 
    private JProgressBar progressBar = new JProgressBar(0, 100); 
    private String newMessage; 
    private double percentForStep; 
    private int remainingSteps; 

public Loader(String taskName, String firstMessage, int steps) { 
    this.remainingSteps = steps-1; 

    dialog = new JDialog((Dialog) null, taskName); 
    dialog.setLayout(new BorderLayout(15, 15)); 
    dialog.add(message, BorderLayout.CENTER); 
    dialog.add(progressBar, BorderLayout.SOUTH); 
    message.setText(firstMessage);  
    percentForStep = 100/steps;    
} 

public void ShowLoader() 
{ 
    dialog.setMinimumSize(new Dimension(400,120));   
    dialog.setLocationRelativeTo(null); 
    dialog.setVisible(true);   
    this.start(); 
} 

public void DestroyLoader(){   
    dialog.dispose(); 
    this.interrupt(); 
} 

public void NewAction(String newMessage){   
    this.newMessage = newMessage; 
    this.remainingSteps--; 
    Lock.changed = true; 
}  

public int RemainingStepsCount() 
{ 
    return remainingSteps; 
} 

@Override 
@SuppressWarnings({"CallToThreadYield", "SleepWhileInLoop"}) 
public void run() {   
    do{  
     synchronized (Lock.class) { 
      if (Lock.changed) { 
       Lock.changed = false; 
       this.message.setText(newMessage); 
       this.progressBar.setValue((int)(100-(remainingSteps*percentForStep))); 
       dialog.repaint(); 
      } 
      dialog.repaint(); 
     } 
    }while(true); 
} 
} 

class Lock{ 
    static boolean changed = false; 
} 
+1

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+1

스윙의 오라클 자습서 개요 및 질문에서 검색 [Java] [스윙] [jprogressbar] - (http://stackoverflow.com/questions/tagged/java+swing+jprogressbar) – mKorbel

+0

또는 오라클 튜토리얼 SplashScreen에 대한 참조 – mKorbel

답변

0

SwingWorker의 자신의 사용에 봐; 나는 그것이 당신이 문제를 해결하는 데 도움이 될 수 있다고 생각합니다.