로더, 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;
}
더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –
스윙의 오라클 자습서 개요 및 질문에서 검색 [Java] [스윙] [jprogressbar] - (http://stackoverflow.com/questions/tagged/java+swing+jprogressbar) – mKorbel
또는 오라클 튜토리얼 SplashScreen에 대한 참조 – mKorbel