Buongiorno a tutti,
ho un problema :
ho un'interfaccia grafica con un bottone che mi manda in esecuzione un programma dos esterno tramite runtime
...
...
{
jButton1 = new JButton();
this.add(jButton1);
mess1=new JLabel();
this.add(mess1);
jButton1.setText("OK");
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try{
pexecute pe = new pexecute();
Process p1 = Runtime.getRuntime().exec("programma "+namedataset);
pe.execute(namedataset,mess1);
Process p2 = Runtime.getRuntime().exec("programma2 "+mess1.getText());
} catch (Exception e) {
e.printStackTrace();}
}
});
}
...
...
public class pexecute {
class StreamGobbler extends Thread
{
private JLabel mess1;
private String namedataset;
public StreamGobbler(String namedataset,JLabel mess1)
{
this.mess1=mess1;
this.namedataset=namedataset;
}
public void run()
{
try
{
mess1.setText("Wait...");
InputStreamReader isr = new InputStreamReader(proc.getInputStream());
BufferedReader br = new BufferedReader(isr);
if((line=br.readLine())!=null){
mess1.setText(line);
}
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
public void execute(String namedataset,BigDecimal rho,JLabel mess1){
try{
StreamGobbler executeGobbler = new StreamGobbler(namedataset,mess1);
executeGobbler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
...
...
il problema è questo:
devo aspettare che il processo p1 finisca visto che mi serve il valore che andra a scrivere sulla JLabel mess1 per eseguire il processo p2.
Ho provato più metodi per risolvere il problema
1. prima di process p2 scrivere qualcosa del genere p1.waitfor();
2. modificare la funzione pexecute in modo che implementa Callable() e con una variabile Future aspetto l'uscita del valore desiderato.
Il problema è che con questo tipo si soluzioni la mia interfaccia si blocca (il pulsante OK rimane premuto e non posso effettuare nessun'altra operazione durante l'esecuzione di p1).
Come evitare questo?
Grazie in anticipo a tutti