Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
Con Midnight, Blizzard tenta il colpaccio: il player housing sbarca finalmente su Azeroth insieme a una Quel'Thalas ricostruita da zero. Tra il dramma della famiglia Ventolesto e il nuovo Prey System, ecco com'è la nuova espansione di World of Warcraft
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-04-2011, 11:29   #1
mirkus90
Member
 
L'Avatar di mirkus90
 
Iscritto dal: Oct 2007
Città: Monopoli(BA)
Messaggi: 218
[java] relazionare Package

ciao raga vi posto la domanda che mi ha fatto un mio amico:
"Sto creando un progetto con la GUI, che deve essere strutturato così:
prima schermata con il login. Dopo essersi loggato, deve scomparire questa schermata e comparire la scheramata principale del progetto.
Il problema sorge qui. Come ca**o faccio.... Ora non ricordo bene come avevo fatto, perchè ci sono riuscito, ma non sono molto convito che vada bene. Praticamente ho aggiunto il frame nel package della prima schermata.... Non so se sta bene. Io vorrei fare che ogni schermata deve avere il suo package. Come ca**o di faaaaaaaa. HELPPPPPPPP "

Penso che si sia capito che il problema è come relazionare due o più Package in uno stesso progetto
__________________
NOSTRAVIS PRO CLASSEM - GrupAer -
mirkus90 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 12:38   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
In java i package non sono relazionabili - in effetti sono entità puramente nominali e del tutto autonome.

Ciò premesso, il problema dev'esere da un'altra parte perchè se il tuo amico vuole creare un package per ogni schermata la soluzione è... creare un package per ogni schermata: da questo punto di vista manca proprio il problema.

Forse non trova il pulsante nell'ide per introdurre un package nel suo progetto oppure riesce a creare tutti i package che vuole ma non riesce a collegare le istanze dichiarate in classi appartenenti ad un package ad istanze di classi dichiarate in altri package.

Bisogna indagare.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 19:21   #3
flex990
Member
 
Iscritto dal: Aug 2009
Messaggi: 88
Salve,
Allora in allegato trovate il progetto in discussione.
Praticamente se vedete dentro il source c'è il package ergon e i jframe gui.java e prince.java.
Io vorrei tramite la pressione di un tasto in gui.java che comparisse prince.java.
Come fare?

Qui il progetto:
http://www.megaupload.com/?d=0DUEU7T9
flex990 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 20:52   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Seleziona la classe GUI.java
Si apre il form editor, seleziona il pulsante "ok", a destra premi il pulsante "Events", scorri in basso fino ad arrivare al mouse listener e rimuovilo (basta cancellare il nome).

Poi fai doppio click sul pulsante "ok". L'ide genera un metodo:

Codice:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }
Al posto del TODO metti:

Prince prince = new Prince();
prince.setVisible(true);

Cioè il metodo diventa:

Codice:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        Prince prince = new Prince();
        prince.setVisible(true);
    }
Se devi fare delle verifiche prima di aprire la finestra prince, li fai prima del setVisible.

Questo apre la finestra. Più che una soluzione è una pezza perchè poi incontrerai altri problemi relativi alla comunicazione tra oggetti. Ma è un altro paio di maniche.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 23:09   #5
flex990
Member
 
Iscritto dal: Aug 2009
Messaggi: 88
E come consiglieresti di fare?
Cioè come dovrei fare per creare un programma con diversi form correlati tra loro e connessi al db?
flex990 è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2011, 11:04   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
La scelta dipende da una divinazione: come si evolverà il programma. Dal punto di vista pratico la soluzione più rapida da scrivere ed usare è probabilmente l'uso di singleton.

Crei una classe e la doti di un campo statico per ogni "modulo" del tuo programma:

Codice:
package ergon;

public class ApplicationElements {

    public static final GUI gui = new GUI();
    public static final Database database = new Database();
    public static final Prince prince = new Prince();
}
Poi crei un punto d'entrata unico del programma, una classe con un main che esegue la prima operazione dell'applicazione, ad esempio aprire la finestra "gui" sullo schermo:

Codice:
package ergon;

import java.awt.EventQueue;

public class Application implements Runnable {

    public void run() {
        ApplicationElements.gui.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Application());
    }
}
Per via di ApplicationElements (ovvero della condivisione di uno stesso ambito di esecuzione da parte degli elementi del tuo programma) In GUI il metodo jButton1ActionPerformed che richiede un Prince diventa:

Codice:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        ApplicationElements.prince.setVisible(true);
    }
Allo stesso modo, quando avrai bisogno di un metodo del database, in una qualsiasi parte del codice, dirai:

ApplicationElements.database.connetti("pippo", "superpippo", "ultrapippo");

Se vuoi introdurre un altro form, lo definisci nella sua classe come per GUI o Prince, lo "pubblichi" in ApplicationElements e lo usi passando per ApplicationElements.


Esistono poi approcci un po' più evoluti. Puoi ad esempio stabilire che ogni elemento del tuo programma sia un "modulo" ed ogni modulo possa accedere agli altri attraverso la condivisione di un canale di comunicazione. Un modulo è un elemento con un ciclo vitale, di solito tripartito o quadripartito:

Codice:
package ergon;

public interface Module {

    void init(Module channel);

    void start(Module channel);

    void stop(Module channel);

    void destroy(Module channel);

    <T extends Module> T find(Class<T> module);
}
Il canale fa le stesse cose di ApplicationElements ma permette di gestire dinamicamente (cioè durante l'esecuzione del programma) chi esegua quali funzioni.

Codice:
package ergon;

import java.util.LinkedHashMap;
import java.util.Map;

public class ModuleChannel implements Module {
    
    private final Map<Class<?>, Module> modules = new LinkedHashMap<Class<?>, Module>();

    public <T extends Module, K extends T> void register(Class<T> type, K module) {
        modules.put(type, module);
    }

    public void init(Module channel) {
        for (Module m : modules.values()) {
            m.init(channel);
        }
    }

    public void start(Module channel) {
        for (Module module : modules.values()) {
            module.start(channel);
        }
    }

    public void stop(Module channel) {
        for (Module module : modules.values()) {
            module.stop(channel);
        }
    }

    public void destroy(Module channel) {
        for (Module module : modules.values()) {
            module.destroy(channel);
        }
    }

    public <T extends Module> T find(Class<T> moduleType) {
        Module module = modules.get(moduleType);
        return module != null ? moduleType.cast(module) : null;
    }
}
E questa è la base. Dopodichè ogni elemento del tuo programma che denoti un gruppo di funzioni autonomo (sia esso un form piuttostoche un pannello in uno di quei form o un database o un servizio di rete eccetera) diventa un modulo. Per essere un modulo, il tipo di quell'elemento implementa Module e definisce i cinque metodi. Ad esempio, GUI dirà:

Codice:
public class GUI extends javax.swing.JFrame implements Module {
    private Module channel;

    public void init(Module channel) {
        this.channel = channel;
    }

    public void start(Module channel) {
        setVisible(true);
    }

    public void stop(Module channel) {
    }

    public void destroy(Module channel) {
        setVisible(false);
    }

    public <T extends Module> T find(Class<T> module) {
        return channel.find(module);
    }
//...eccetera
Prince dirà:

Codice:
public class Prince extends javax.swing.JFrame implements Module {
    private Module channel;

    public void init(Module channel) {
        this.channel = channel;
        //altre operazioni di inizializzazione
    }

    public void start(Module channel) {
        //operazioni di avvio
    }

    public void stop(Module channel) {
        //operazione di interruzione
    }

    public void destroy(Module channel) {
        //operazioni di rilascio
    }

    public <T extends Module> T find(Class<T> module) {
        return channel.find(module);
    }
//...eccetera
E database:

Codice:
public class Database implements Module {
    private Module channel;

    public void init(Module channel) {
        this.channel = channel;
    }

    public void start(Module channel) {
    }

    public void stop(Module channel) {
    }

    public void destroy(Module channel) {
    }

    public <T extends Module> T find(Class<T> module) {
        return channel.find(module);
    }
//...eccetera
Infine, il punto d'entrata del programma crea un canale, registra tutti i moduli e avvia il sistema:

Codice:
package ergon;

import java.awt.EventQueue;

public class Main implements Runnable {

    public void run() {
        ModuleChannel ch = new ModuleChannel();
        ch.register(Database.class, new Database());
        ch.register(GUI.class, new GUI());
        ch.register(Prince.class, new Prince());
        ch.init(ch);
        ch.start(ch);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Main());
    }
}
Che ci mettiamo adesso dentro al jButton1ActionPerformed di GUI per aprire Prince? L'accesso tramite il canale:

Codice:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        find(Prince.class).setVisible(true);
    }
La seconda via è chiaramente più complicata ma offre maggiori opportunità nella gestione della struttura del programma perchè puoi "pubblicare" parti di classi in moduli diversi, rimpiazzare un modulo con un altro, gestire moduli che operano in thread diversi e via dicendo. Se il programma non è sufficientemente complesso, i singleton vanno benissimo.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2011, 13:14   #7
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
...è sempre consigliabile separare la logica dalla grafica...ne consegue che la gestione di elementi come db o simili non hanno nessuna relazione con l'interfaccia e i suoi possibili mille mila frame...la comunicazione tra questi la si fa con uno strato ad eventi...
ally è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2011, 21:14   #8
flex990
Member
 
Iscritto dal: Aug 2009
Messaggi: 88
@PGI-Bis:
Mammamia, complimenti per la ottima preparazione. Ora ho capito come devo fare... Sono indirizzato per i canali di comunicazione. Vorrei fare una cosa in grande, se mi riesce
Grazie 1000!!!

@ally:
Era l'idea con cui ero partito, ma non sapevo come fare...
Cosa intendi per strato ad eventi?
flex990 è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2011, 08:14   #9
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
Quote:
Originariamente inviato da flex990 Guarda i messaggi
@PGI-Bis:
Mammamia, complimenti per la ottima preparazione. Ora ho capito come devo fare... Sono indirizzato per i canali di comunicazione. Vorrei fare una cosa in grande, se mi riesce
Grazie 1000!!!

@ally:
Era l'idea con cui ero partito, ma non sapevo come fare...
Cosa intendi per strato ad eventi?
...intendo che la logica di funzionamento legata all'interfaccia grafica non è annegata su questa...la pressione di un tasto scatena un evento verso la classe main che sceglierà l'operazione da svolgere...

Codice:
loginButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                login(...);
            }
        });
...diventerà nella classe dell'interfaccia :

Codice:
...

loginButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
               launchEvent("login");
            }
        });

...

private  void launchEvent(String evento) {
        
        GraphicEvent event = new GraphicEvent(this,evento);
        
        this.listeners.performedEvent(event);

        }
    }
...e nella main class :

Codice:
public void performedEvent(GraphicEvent e) {
        
       if(e.getEvent().equals("login"))
        {    
             login(...);
        }   
        else if(e.getFire().equals("reset"))
        {    
            ...
        }
ally è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
Le fotografie dell'eclissi solare e dell...
Oracle AI Database si potenzia con nuove...
Russia offline: blackout internet mobile...
Gemini, Google investe 30 milioni per la...
Roborock Qrevo Edge S5A: 17.000 Pa, acqu...
Resa pubblica la foto della ''Terra che ...
Il robot che ha piegato 200 scatole di f...
SteelSeries Aerox 3 Wireless Gen 2: nuov...
"Quasi sociopatico": Sam Altma...
Star Wars Eclipse in difficoltà: ...
Gestione del team e romance organiche: l...
Intel lancia Core Ultra X9 378H: hardwar...
Tomodachi Life non supporterà Handheld M...
Identificati i boss di REvil e GandCrab:...
Google Chrome 148 introduce il caricamen...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:50.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v