Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Abbiamo potuto mettere le mani in anteprima sul nuovo monitor MSI dedicato ai giocatori: un mostro che adotta un pannello QD-OLED da 26,5 pollici con risoluzione 2560 x 1440 pixel, frequenza di aggiornamento fino a 500 Hz e tempo di risposta di 0,03 ms GtG
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI aggiorna la sua linea di droni ultraleggeri con Neo 2, un quadricottero da 160 grammi che mantiene la compattezza del predecessore ma introduce una stabilizzazione meccanica a due assi, sensori omnidirezionali e un sistema LiDAR
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


OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone L'IA "seria" di Appian è divers...
Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
AWS Transform si evolve: agenti IA per m...
I social network hanno stancato gli ital...
Star Citizen supera i 900 milioni di dol...
Netflix ha eliminato la funzione Cast pe...
L'IA è una bolla e scoppier&agrav...
Un rapporto collega i data center di Ama...
Troppa concorrenza per Cherry (quella de...
Entro il 2035 la Cina vuole costruire de...
Tineco in super sconto: ultimo giorno di...
La Cina creerà una costellazione ...
I veicoli elettrici emettono radiazioni ...
Stai per acquistare una PS5? Attento al ...
iPhone 17 Pro Max finalmente disponibile...
Apple, Sony, Bose, Beats, Sennheiser, CM...
Arriva il Raspberry Pi 5 da 1 GB, ma por...
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: 00:53.


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