pozwole sobie wkleic troche kodu:
public class ProgressDialog extends JDialog{
private static final long serialVersionUID = 4682348576951695187L;
private long destination;
private JProgressBar progressBar;
private JButton cancel;
private boolean disposed;
protected ProgressDialog(JFrame frame,String title,long destination){
super(frame);
setTitle("Postep...");
Toolkit tool=Toolkit.getDefaultToolkit();
setSize(300,100);
setLocation(tool.getScreenSize().width/2-150,tool.getScreenSize().height/2-50);
//setModal(true);
setResizable(false);
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
this.destination=destination;
disposed=false;
setLayout(new GridLayout(3,1));
Box labelBox=Box.createHorizontalBox();
labelBox.add(Box.createGlue());
labelBox.add(new JLabel(title));
labelBox.add(Box.createGlue());
add(labelBox);
progressBar=new JProgressBar(0,100);
progressBar.setStringPainted(true);
add(progressBar);
cancel=new JButton("Anuluj");
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
disposed=true;
dispose();
}
});
add(cancel);
setAlwaysOnTop(true);
setVisible(true);
}
public void setProgres(long progress){
progressBar.setValue((int)(progress*100/destination));
repaint();
if (progressBar.getValue()==100){
disposed=true;
dispose();
}
}
public boolean isDisposed(){
return disposed;
}
}
To jest klasa odpowiedzialna za okienko z postepem, natomiast to:
public void loadFromFile() throws MyException{
try {
final FileInputStream fstream=new FileInputStream("test");
final ObjectInputStream in= new ObjectInputStream(fstream);
final Thread mainThread=Thread.currentThread();
products=new TreeSet<Product>();
ProgressDialog prg;
final Thread thread=new Thread(){
public void run(){
try {
long available=fstream.available();
ProgressDialog prg=null;
if (available>0)
prg=new ProgressDialog(null,"Wczytywanie",available);
while(fstream.available()>0&&!prg.isDisposed()){
products.add((Product)in.readObject());
prg.setProgres(available-fstream.available());
// sleep(10);
}
in.close();
// synchronized(this) {mainThread.notify();}
// } catch (InterruptedException e) {
} catch (IOException e) {e.printStackTrace();
} catch (ClassNotFoundException e) {e.printStackTrace();
// } catch (InterruptedException e) {e.printStackTrace();
}
//mainThread.notifyAll();
}
};
thread.setDaemon(true);
thread.run();
// mainThread.wait(1000);
// thread.join();
// synchronized (this) {
// mainThread.wait();
// }
// while(thread.isAlive()) ;
} catch (FileNotFoundException e) {
throw new MyException("Nie znaleziono pliku!");
} catch (IOException e) {
throw new MyException("Blad przy odczycie!");
}
}
jest kod odpowiedzialny za wyswietlenie okienka.
niestety albo program czeka az dialog zrobi dispose(), lecz jest ono cale szare, albo dialog sie wyswietla, lecz zanim plik zdazy sie wczytac - juz wykonuja sie inne operacje na bazie!
czy moglbym prosic o poprawienie mojego kodu/sugestie w jaki sposob sprawic aby sprawic ze dalsze wykonanie programu bedzie uzaleznione od zamkniecia okienka?
pozdrawiam
PS. nie mam pojecia dlaczego sie tak kod rozjezdza i skad te "Null>"null"........