Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-04-2011, 12: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, 13: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, 20: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, 21: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 05-04-2011, 00: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, 12: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, 14:14   #7
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
...è 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, 22: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, 09:14   #9
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
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


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
LG UltraFine evo 6K: il primo monitor al...
DJI cambia direzione: investe in Elegoo ...
Black Friday Narwal 2025: risparmi da ca...
Phishing evoluto contro Apple ID: caso f...
Prestazioni in discesa nei giochi? NVIDI...
Addio ai banner dei cookie? L'UE spinge ...
Le offerte Black Friday per gli smartpho...
Il controllo qualità degli iPhone...
Qualcomm Snapdragon X Elite vola con il ...
A2RL Season 2: storia, innovazione e sor...
Core Ultra Series 3: Intel conferma l'ev...
Black Friday Amazon: la GeForce RTX 5070...
EcoFlow, il Black Friday porta grande ri...
Gli sconti più pesanti del Black ...
Smart #5 BRABUS segna il nuovo record di...
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: 20:01.


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