나는 bufferedInputStream을 사용하여 큰 파일을 저장하는 Java 응용 프로그램을 개발 중입니다. 업로드 된 파일의 비율을 나타내는 JDialog 안에 progressbar를 넣었습니다.이 막대는 매 n 초마다 증가합니다. 문제는 응용 프로그램이 대화 상자를 닫을 때까지 무기한 대기하기 때문에 종료되지 않습니다. 누구든지 도움을받을 수 있습니까?Java 업로드 비율 progressbar 스레드
JDialog dialog = new JDialog(Main.getMainFrame(), true);
ProgressBarJPanel progressBarJPanel = new ProgressBarJPanel();
dialog.setContentPane(progressBarJPanel);
Runnable r = new Runnable(){
public void run(){
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
progressBarJPanel.startProgress();
dialog.pack();
dialog.setVisible(true);
}
});
//this is the long running job
while ((val = bufferedInputStream.read()) != -1)
{
fileOutputStream.write(val);
}
//here is the callback to UI thread
SwingUtilities.invokeLater(new Runnable(){
public void run(){
progressBarJPanel.end();
dialog.setVisible(false);
}
}
};
Thread t = new Thread(r);
t.start();
: ben75 조언에 따라 솔루션 EDIT 여기
한다 -
JDialog dialog = new JDialog(Main.getMainFrame(), true);
ProgressBarJPanel progressBarJPanel = new ProgressBarJPanel();
dialog.setContentPane(progressBarJPanel);
dialog.pack();
dialog.setVisible(true);
while ((val = bufferedInputStream.read()) != -1)
{
fileOutputStream.write(val);
}
progressBarJPanel.end();
dialog.setVisible(false);
및
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ProgressBarJPanel extends JPanel
implements ActionListener
{
private JProgressBar progressBar;
private Timer timer;
public Thread updateThread;
public final static int ONE_SECOND = 1000;
private JTextArea taskOutput;
private String newline = "\n";
int timeNow= 0;
int progress = 0;
public ProgressBarJPanel()
{
super(new BorderLayout());
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
taskOutput = new JTextArea(5, 20);
taskOutput.setMargin(new Insets(5,5,5,5));
taskOutput.setEditable(false);
taskOutput.setCursor(null);
JPanel panel = new JPanel();
panel.add(progressBar);
add(panel, BorderLayout.PAGE_START);
add(new JScrollPane(taskOutput), BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
//Create a timer.
timer = new Timer(ONE_SECOND, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
progressBar.setValue(progress);
progress+=10;
String s = "now at "+progress+"%";
if (s != null) {
taskOutput.append(s + newline);
taskOutput.setCaretPosition(
taskOutput.getDocument().getLength());
}
}
});
}
public void end()
{
timer.stop();
}
public void startProgress()
{
timer.start();
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI()
{
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("ProgressBarDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new ProgressBarJPanel();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args)
{
createAndShowGUI();
}
@Override
public void actionPerformed(ActionEvent e)
{
throw new UnsupportedOperationException("Not supported yet.");
}
}
incriminated 클래스 : 여기
은 기본 응용 프로그램 코드 조각입니다
조언을 사용하십시오 UI를 다루는 것보다는 시간이 많이 걸리는 작업에 다른 스레드를 사용하여 ... – ppeterka
어떻게 두 사람은 의사 소통을 하는가? 또한 위의 넷빈즈는 저에게 updateThread.start(); 생성자 안에 있으면 안된다. 어떻게 바깥에 놓을 까? – dendini
[this example] (http://stackoverflow.com/questions/15199091/progress-bar-java/15199220#15199220) – MadProgrammer