Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9

    Aiuto, grande problema nella creazione di un IDE per java

    Salve a tutti, allora il mio problema è questo: ho costruito un IDE molto semplice per la programmazione in Java. Questo IDE è composto da due jTextArea codice e console e un pulsante per compilare ed eseguire il codice scritto. Lo schema di funzionamento prevede di scrivere il codice nella JTextArea codice e poi salvarlo in un file,compilarlo ed eseguirlo con la pressione del pulsante, tutti gli output di compilazione ed esecuzione sono stati rediretti alla JTextArea console. Quando compilo ed eseguo il codice che ho scritto lo faccio attraverso la creazione di un nuovo processo, cioè:
    ProcessBuilder pb=new ProcessBuilder("javac","-g","-verbose","-cp",classpath,nomeFile);
    Process pr=pb.start(); per compilare il codice;
    ProcessBuilder pb=new ProcessBuilder("java","-verbose","-classpath",classpath,tempNomeFile);
    Process pr=pb.start(); per eseguire il codice
    Il problema, ora sta nel fatto che se creo un programma che legge dei caratteri digitati su console e poi lo eseguo, mi rimane bloccato sulla lettura dei caratteri, poiche non ho la console come il dos in cui scrivere e se scrivo nella JTextArea console non succede niente. Ora quindi esiste un modo per comunicare al processo il carattere che ho digitato?Oppure esistono altri metodi per far funzionare il tutto?? Quello che vorrei fare io è come quando eseguo un programma java da dos, che scrivo i caratteri e il programma li riconosce.Grazie

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

    Re: Aiuto, grande problema nella creazione di un IDE per java

    Originariamente inviato da orcL3
    Il problema, ora sta nel fatto che se creo un programma che legge dei caratteri digitati su console e poi lo eseguo, mi rimane bloccato sulla lettura dei caratteri, poiche non ho la console come il dos in cui scrivere e se scrivo nella JTextArea console non succede niente. Ora quindi esiste un modo per comunicare al processo il carattere che ho digitato?
    La cosa più semplice e immediata è registrare un KeyListener sulla JTextArea che "simula" la console. Quando ricevi notifica in keyTyped() di un carattere, dovresti scriverlo sul OutputStream che ti fornisce Process. Ma non è tutto qui. Infatti tu hai dei char ... mentre con OutputStream scrivi solo byte "crudi". Dovresti quindi incapsulare l'OutputStream ad esempio in un OutputStreamWriter per poter scrivere "a caratteri". E qui c'è un'altra questione: quale charset di codifica dei caratteri? Quello di default della piattaforma?

    Ma non è ancora finito: la "vera" console generalmente è "bufferizzata". I caratteri arrivano alla applicazione solo quando viene premuto invio. E la console gestisce "a monte" la cancellazione con backspace.

    Se vuoi renderti conto meglio, prova questo programmino:

    codice:
    import java.io.*;
    
    public class Prova {
        public static void main(String[] args) {
            try {
                InputStreamReader isr = new InputStreamReader(System.in);
                int ch;
    
                while ((ch = isr.read()) != -1) {
                    System.out.println("premuto '" + (ch > 31 ? (char) ch : "") + "'  (codice " + ch + ")");
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
    Lancialo da una console "vera". Digita i caratteri "pippo". Non vedi subito le righe "premuto ...blabla...". Premi invio e ... le vedrai tutte quante di botto.
    Capito? E se dopo la 'o' di pippo premi backspace, la console cancella il carattere dal buffer e se digiti es. 'a' (e poi invio) alla applicazione arriva "pippa" ... non pippo [codice backspace] a

    Tutto questo solo per farti capire le problematiche. Se le hai capite .... intuisci che non è così banale fare esattamente ciò che fa la console vera.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    ciao, allora io ho fatto in questo modo ma non sembra funzionare:
    public class Listener implements ActionListener, KeyListener{
    ...
    private Process p=null;
    ...
    ...

    private void eseguiProgramma(){
    ...
    ...
    ProcessBuilder pb=new ProcessBuilder(...);
    Process pr=pb.start();
    this.p=pr;
    ...
    }

    public void keyTyped(KeyEvent ke) {
    OutputStream os=this.p.getOutputStream();

    try{

    PrintStream pw= new PrintStream(os, true);
    pw.print(c);
    pw.flush();
    pw.close();

    }catch (Exception e){
    System.out.println("eccezione riscontrata:"+e.getMessage());
    }

    }

    Sostanzialmente dall'ide che ho creato ho lanciato in programma che legge in ingresso un singolo carattre, ma quando dall'area di stesto che funge da console digito una lettera sembra che non viene passata all'outputStream del processo. Ora come si potrebbe fare per risolvere la situazione???grazie...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da orcL3
    ciao, allora io ho fatto in questo modo ma non sembra funzionare:
    public class Listener implements ActionListener, KeyListener{
    ...
    private Process p=null;
    ...
    ...

    private void eseguiProgramma(){
    Ciò che hai appena postato non dice un bel nulla .... hai implementato il metodo keyTyped()?? Il char fornito dal KeyEvent l'hai scritto sul OutputStream che va allo standard-input del processo?? (già per quest'ultimo punto vale quanto ho già detto ... OutputStream scrive byte ... non char!!)

    Hai compreso le varie questioni che ho spiegato sopra??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    ora ti scrivo il codice:

    public class Listener implements ActionListener, KeyListener{
    ...
    private Process p=null;
    ...
    ...

    private void eseguiProgramma(){
    ...
    ...
    ProcessBuilder pb=new ProcessBuilder(...);
    Process pr=pb.start();
    this.p=pr;
    ...
    }

    public void keyTyped(KeyEvent ke) {
    OutputStream os=this.p.getOutputStream();

    try{

    PrintStream pw= new PrintStream(os, true);
    pw.print(c);
    pw.flush();
    pw.close();

    }catch (Exception e){
    System.out.println("eccezione riscontrata:"+e.getMessage());
    }

    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da orcL3
    ora ti scrivo il codice:
    Ah sì .. ora si capisce meglio!
    Innanzitutto sarebbe meglio se il PrintStream lo crei 1 volta sola ... non ad ogni tasto!!
    Poi comunque hai scritto pw.print(c); ... ma quel 'c' cosa/dove è??? Devi prendere il carattere dal KeyEvent.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    si scusa hai perfettamente ragione, sto a fa macelli col copia e incolla... cmq ci manca
    char c= ke.getKeyChar();
    che è il carattere che passo a pw.print(c);

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    a me come prima cosa basterebbe che il programma che lancio con il mio ide legge un solo carattere che digito ma per il momento non succede niente...

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da orcL3
    a me come prima cosa basterebbe che il programma che lancio con il mio ide legge un solo carattere che digito ma per il momento non succede niente...
    Senti ... la questione è anche un'altra. Tu avvii un'altra applicazione tramite ProcessBuilder. Questa applicazione che cosa è??? E sopratutto come/quando legge dallo standard input?? Se leggesse ad esempio "a righe" si aspetta allora un newline e sarebbe chiaro che se digiti solo qualche carattere, non succede nulla .... finché non premi invio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    l'applicazione che eseguo è la seguente:
    import java.io.*;
    public class stdin {
    public static void main(String[] args) {
    try{
    //inizio codice

    try{
    System.out.println("scrivi qualcosa:");
    char scelta=(char)System.in.read();
    System.out.println("hai scritto:"+scelta);
    }catch (Exception e){
    System.out.println("errore");
    }

    l'avvio tramite il processBuilder in questo modo:
    ProcessBuilder("java","-verbose","-classpath", classpath,nomeFile);

    la riga 'scrivi qualcosa' viene visualizzata ma poi quando digito un carattere non succede più niente...

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.