Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    redirezione output console in una JTextArea

    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?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: redirezione output console in una JTextArea

    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?
    Quindi hai un Process e puoi ottenere da questo un InputStream (getInputStream() ) da cui leggere lo "standard output" del processo.

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    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) { 
    		}
    }
    }

  4. #4
    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?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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?
    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.

    Nota che non necessariamente devi estendere Thread. In alternativa puoi implementare Runnable e poi istanziare un Thread passandogli il tuo Runnable.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    ho messo su la seguente classe MyRunnable

    codice:
    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();
    		}
    		
    		
    		
    	}
    
    }
    poi ho la seguente classe MyFrame

    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) { 
    			}
    	}
    		
    }
     }
    Ma non mi scrive nulla sulla JTextArea dov'è che sbaglio?

  7. #7
    modificato classe MyRunnable

    codice:
    
    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();
    						}
    			    }
    	}
    }
    e ovviamente mancava l'istruzione nella classe MyFrame
    lettura.start();

    ma ancora nn mi compare nulla...

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    quando crei il JFrame, prova a richiamare come ultima cosa pack();
    al volante son nervoso

  9. #9
    l'istruzione pack() permette di ridimensionare la finestra tenendo conto della dimensione dei componenti al suo interno!! Ho provato ma nn funge!!

  10. #10
    ho provato con un File e quindi un FileinputStream funziona il tutto!! Perchè dalla console nn legge?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.