Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Creare una finestra con JPannel

    Ciao a tutti, faccio ovviamente i complimenti
    per il sito e per il forum visto che è il mio primo post!
    Scrivo per chiedere un'informazione.
    Ho personalizzato una applet java già realizzata
    da un programmatore che funziona (ovviamente) su un browser. La mia domanda è:
    come posso fare in modo che funzioni in modo "stand alone" (non so se si dice così anche in java!), ovvero solo eseguendo il fine java.
    Non so se mi sono spiegato bene, spero si capisca!

    grazie1000 a tutti in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ciao, la cosa è fattibile, anche se alcuni meccanismi propri delle applet non andranno a funzionare e quindi necessiteranno di ulteriori rimaneggiamenti. Comunque in linea di massima la linea da seguire è:

    - estendere JFrame invece di JApplet (o Applet);
    - rivedere la modalità di aggiunta dei componenti (.getContentPane().add(...));
    - rivedere la modalità di accesso ai dati (è più libera in un programma stand-alone, ma chiaramente l'apertura di un documento tramite AppletContext... non funzionerà più).
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    azz... la cosa è piu' tosta di quanto credevo... non so molto di
    java, non è che potresti darmi una spiegazione piu' "terra terra"?!!?
    magari con esempi di codice?

    ovviamente grazie x le info!

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Ho modificato il titolo per renderlo maggiormente significativo per l'argomento trattato; magari, potrà essere utile a chi, in futuro, si trovi ad affrontare lo stesso problema.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Esempio breve ma che ti mostra un po' di cose.

    (J)Applet:

    codice:
    import javax.swing.*;
    import java.net.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    
    public class daJApplet extends JApplet {
      JLabel title, immagine;
      JButton htmlit;
      AppletContext ac;
      public void init() {
        this.setLayout(new BorderLayout());
        title = new JLabel("Questa è una JApplet");
        htmlit = new JButton("Vai html.it");
        ac =  this.getAppletContext();
        try {
          immagine = new JLabel(new ImageIcon(this.getClass().getResource("logo2.gif")));
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        this.add(title, BorderLayout.NORTH);
        this.add(immagine, BorderLayout.CENTER);
        this.add(htmlit, BorderLayout.SOUTH);
        htmlit.addActionListener(new AbstractAction() {
          public void actionPerformed (ActionEvent ae) {
            try {
              ac.showDocument(new URL("http://www.html.it"));
            }
            catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
      }
      
      public static void main (String[] args) {
        System.out.println("Questa è un applet");
      }
    }
    e relativo HTML di test
    codice:
    <html>
      <head>
        <title>Prova JApplet HTML.IT</title>
      </head>
      <body>
        <applet height="200" width="300" code="daJApplet.class">
        </applet>
      </body>
    </html>
    Invece questa è l'applicazione Stand-Alone
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.net.*;
    
    public class aStandAlone extends JFrame {
      
      JLabel title,immagine;
      JButton htmlit;
      
      private String openBrowser = "cmd /k START iexplore.exe http://www.html.it";
      
      public aStandAlone() {
        super("Applicazione di Test per il forum di HTML.IT");
        this.getContentPane().setLayout(new BorderLayout());
        title = new JLabel("Questa è un'applicazione Stand-Alone");
        htmlit = new JButton("Vai a HTML.IT");
        
        try {
          immagine = new JLabel(new ImageIcon(new URL("http://utenti.html.it/common/img/logo2.gif")));
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        
        htmlit.addActionListener(new AbstractAction() {
          public void actionPerformed (ActionEvent ae) {
            try {
              Runtime r = Runtime.getRuntime();
              Process p = r.exec(openBrowser);
            }
            catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
        
        this.getContentPane().add(title, BorderLayout.NORTH);
        this.getContentPane().add(immagine, BorderLayout.CENTER);
        this.getContentPane().add(htmlit, BorderLayout.SOUTH);
        
        this.setResizable(false);
        this.setSize(300, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
      }
      
      public static void main (String[] args) {
        aStandAlone asa = new aStandAlone();
      }
    }

    Principali differenze:
    La JApplet funziona bene come contenitore; i vari elementi grafici sono inizializzati in init() e lì aggiunti direttamente alla JApplet. Una JApplet di norma non può accedere alle risorse esterne al percorso in cui è radicata, per cui per mostrare il logo di html.it ho dovuto scaricarlo e salvarlo nella cartella dove l'applet risiede. Il modo di caricare l'immagine (via getResource) ti facilita nel caso in cui volessi impacchettare il tutto in un jar. Nota, questo sistema può (anzi deve) essere utilizzato anche per le applicazioni Stand-Alone impacchettate nei jar per caricare i file nel jar stesso.
    Vantaggio dell'applet è che lei sa benissimo di trovarsi e girare in un browser, per cui aprire un link è molto semplice.
    L'applicazione Stand-Alone invece è meno restrittiva nel caricamento di risorse esterne (guarda come ho caricato il file di immagine dando direttamente l'url del file gif ad ImageIcon), però non sa minimamente dove stia girando, ed infatti per far aprire il link ho dovuto usare quell'acrocchio con l'esecuzione di un comando a runtime. Per il resto, a parte il getContentPane di cui ti avevo già accennato, il sistema è molto simile e facilmente traducibile (di norma è molto più facile tradurre un'applet in un'applicazione in frame che non il viceversa, causa restrizioni imposte alla JVM che esegue applet).
    Saluti.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Grazie 1000 per l'ottima e dettagliata spiegazione, provo a modificare il mio
    codice e ti faccio poi sapere se va tutto a buon fine!

    grazie ancora

  7. #7
    Ciao, allora ho provato a personalizzare un pò il mio
    codice. Quello che vorrei fare è una prima finestra
    a "mo di windows" con i vari menu' a cascata (tipo "File", "Modifica", etc.)
    qui di seguito il mio codice (che però restituisce un errore, penso di sintassi...)

    Codice PHP:

    import java
    .awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.net.*;

    public class 
    inizio extends JFrame
    {

      
    JMenuItem start;
      
    JMenuItem esci;
      
    JMenuItem regolamento;
      
    JMenuItem crediti;
      
    JLabel immagineSfondo;

     public 
    inizio()
      {
        
    super(new BorderLayout());

        
    JMenuBar menubar = new JMenuBar();            // crea la barra del menu'

        
    JMenu file = new JMenu("File");                // prima voce nella barra (File)
        
    JMenu file2 = new JMenu("?");                // seconda voce nella barra (?)

        
    start = new JMenuItem("Nuova partita");     // voce contenuta nel primo JMenu
        
    start.addActionListener(new Listener());

        
    esci = new JMenuItem("Esci");                // seconda voce contenuta nel primo JMenu
        
    esci.addActionListener(new Listener());

        
    file.add(nuova);
        
    file.add(esci);

        
    regolamento = new JMenuItem("Regolamento");   // prima voce contenuta nel secondo JMenu
        
    regolamento.addActionListener(new Listener());

        
    crediti = new JMenuItem("Crediti");              // seconda voce contenuta nel secondo JMenu
        
    crediti.addActionListener(new Listener());

        
    file2.add(regolamento);
        
    file2.add(crediti);

        
    menubar.add(file);
        
    menubar.add(file2);
        
    add(menubarBorderLayout.NORTH);
        
    immagineSfondo = new JLabel(new ImageIcon("sfondo.jpg"));
        
    add(immagineSfondoBorderLayout.CENTER);
         }
     } 
    poi quello che sto cercando di realizzare è il modo che (ovviamente)
    ad ogni clic sulle varie sottovoci dei due menu' ("File" e "?") corrisponda un'azione,
    contenuta in altre classi esterne che verrebbero richiamate.
    Forse sono stato un pò contorto, spero si capisca cosa vorrei fare!

    come potrei procedere?

    grazie ancora!

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Comincerei con il dividere, appunto, in classi: stai creando il Menu della tua applicazione... mettilo in una classe che estenda JMenuBar e in quella stessa classe vai a definire i vari listener per i vari elementi (voci) del menu. Se tieni la parte della creazione della GUI della tua applicazione ben suddivisa, aggiunte e modifiche in un secondo momento saranno molto più semplici. Per esempio potresti avere la suddeta classe per il menu, una classe per mostrare i dati della partita (che so, tipo punteggio, livello etc etc) che estenda JPanel) e quindi nella creazione della tua finestra di gioco istanzierai il tuo JFrame gli setterai il layout adatto e semplicemente istanzierai i super-oggetti della gui.

    Comunque ad occhio il tuo codice non funziona perché non hai definito il Listener che stai andando ad appicciare al menuitem.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.