Salve ragazzi!!!
Ho costruito una finestra contenente una JTextArea e alla sua apertura ho associato l'esecuzione di un file .bat. Ora vorrei redirezionare l'output riportato nella console nella JTextArea. Come posso fare?
Salve ragazzi!!!
Ho costruito una finestra contenente una JTextArea e alla sua apertura ho associato l'esecuzione di un file .bat. Ora vorrei redirezionare l'output riportato nella console nella JTextArea. Come posso fare?
Quindi hai un Process e puoi ottenere da questo un InputStream (getInputStream() ) da cui leggere lo "standard output" del processo.Originariamente inviato da royaleagle25
Ho costruito una finestra contenente una JTextArea e alla sua apertura ho associato l'esecuzione di un file .bat. Ora vorrei redirezionare l'output riportato nella console nella JTextArea. Come posso fare?
Ma devi creare un thread separato, passargli questo InputStream e fare in modo che il "lavoro" del thread consista semplicemente nel leggere in ciclo i caratteri (a blocchi, per maggior efficienza) e "buttarli" nel componente con append() di JTextArea.
Unica questione, quella solita sul charset. InputStream fornisce byte, non "caratteri". Ma se si suppone l'uso del charset di default della piattaforma da parte del processo lanciato, allora basta mettere l'InputStream in un InputStreamReader, da cui puoi già leggere a "blocchi" di char.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
codice:public void windowOpened(WindowEvent e){ Runtime r = Runtime.getRuntime(); String[] parametri=new String[4]; parametri[0]="cmd.exe"; parametri[1]="/C"; parametri[2]="start"; parametri[3]="avvio.bat"; File a = new File (System.getProperty("user.home") + "\\workspace\\"); try{ Process p=r.exec(parametri, null, a); } catch(IOException ex) { } } }
Quindi dovrei fare eseguire nel codice sopra:
InputStream is = p.getInputStream();
costruire una classe MyThread che estende la classe Thread le cui variabili di istanza sono un InputStream e la JTextArea e modificare il metodo run?
e quindi istanziare nella classe un oggetto MyThread
dovrebbe essere questo il procedimento?
Sì, a grandi linee è questo. Andrebbe fatto tutto ben incapsulato e gestito correttamente, anche per quanto riguarda le possibili eccezioni. Ma qui dipende dalle tue conoscenze sulla OOP.Originariamente inviato da royaleagle25
Quindi dovrei fare eseguire nel codice sopra:
InputStream is = p.getInputStream();
costruire una classe MyThread che estende la classe Thread le cui variabili di istanza sono un InputStream e la JTextArea e modificare il metodo run?
e quindi istanziare nella classe un oggetto MyThread
dovrebbe essere questo il procedimento?
Nota che non necessariamente devi estendere Thread. In alternativa puoi implementare Runnable e poi istanziare un Thread passandogli il tuo Runnable.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ho messo su la seguente classe MyRunnable
poi ho la seguente classe MyFramecodice:public class MyRunnable implements Runnable{ InputStream input; JTextArea area; public MyRunnable (InputStream in, JTextArea a ){ input=in; area=a; } public void run(){ InputStreamReader isr = new InputStreamReader(input); StringBuffer sb = new StringBuffer (); char[] buf = new char[1024]; int len; try { while ((len = isr.read(buf))>0){ sb.append (buf, 0, len); area.append(sb.toString()); } } catch (IOException e) { e.printStackTrace(); } } }
Ma non mi scrive nulla sulla JTextArea dov'è che sbaglio?codice:import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.io.InputStream; class MyFrame extends JFrame{ JTextArea textArea = new JTextArea(); public MyFrame (){ super("SubcriptionManager"); this.setLayout(new BorderLayout()); this.setSize(600,400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); Container c =this.getContentPane(); c.setLayout(new BorderLayout()); textArea.setWrapStyleWord(true); JScrollPane ScrollPane = new JScrollPane(textArea); c.add(ScrollPane, BorderLayout.CENTER); AscoltatoreFinestra a = new AscoltatoreFinestra(); this.addWindowListener(a); } class AscoltatoreFinestra extends WindowAdapter { public void windowOpened(WindowEvent e){ Runtime r = Runtime.getRuntime(); String[] parametri=new String[4]; parametri[0]="cmd.exe"; parametri[1]="/C"; parametri[2]="start"; parametri[3]="avvio.bat"; File a = new File (System.getProperty("user.home") + "\\workspace\\"); try{ Process p=r.exec(parametri, null, a); InputStream is = p.getInputStream(); JTextArea ar = textArea; MyRunnable rt = new MyRunnable (is,ar); Thread lettura = new Thread(rt); } catch(IOException ex) { } } } }
modificato classe MyRunnable
e ovviamente mancava l'istruzione nella classe MyFramecodice:public class MyRunnable implements Runnable{ InputStream input; JTextArea area; public MyRunnable (InputStream in, JTextArea a ){ input=in; area=a; } public void run(){ InputStreamReader isr = new InputStreamReader(input); StringBuffer sb = new StringBuffer (); char[] buf = new char[1024]; int len; try { while ((len = isr.read(buf))>0){ sb.append (buf, 0, len); area.append(sb.toString()); } } catch (IOException e) { e.printStackTrace(); } finally{ if (isr != null) try { isr.close (); } catch (IOException e) { e.printStackTrace(); } } } }
lettura.start();
ma ancora nn mi compare nulla...
quando crei il JFrame, prova a richiamare come ultima cosa pack();
al volante son nervoso
l'istruzione pack() permette di ridimensionare la finestra tenendo conto della dimensione dei componenti al suo interno!! Ho provato ma nn funge!!
ho provato con un File e quindi un FileinputStream funziona il tutto!! Perchè dalla console nn legge?