Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
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


Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
L'Olanda punta su NixOS e open source pe...
OPPO Find X10 Pro Max, il flagship con t...
Gli smartphone Samsung potrebbero avere ...
GeForce Now arriverà sui Googlebo...
Opus 5.5 e GPT-6 Sol nello stesso pomeri...
Weekend Amazon, le prime 5 offerte sono ...
Mini Compressore a 21,84€: gonfia le gom...
Gemini si aggiorna, ora può conne...
Da 32 a 65 pollici: ecco le TV più...
Xiaomi Redmi Note 17 a 269€: ecco perch&...
ASUS avverte i clienti: accesso non auto...
Già record di vendite su Amazon p...
Eni mette un tetto ai prezzi dei carbura...
BYD Seagull (Dolphin Surf), l'elettrica ...
Multa milionaria per un data center del ...
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: 12:07.


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