Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-05-2009, 09:41   #1
LacioDromBuonViaggio
Senior Member
 
L'Avatar di LacioDromBuonViaggio
 
Iscritto dal: Jul 2008
Città: Sardegna
Messaggi: 1005
[JAVA/Swing] Semplice interfaccia con classi Listener esterne.

Come da titolo, per addentrarmi nel mondo dell'interfacce JAVA (visto che ho un esame il 4 giugno ), sto creando un semplice programmino che consente di caricare, modificare e salvare un banalissimo file di testo.

Dopo aver scritto le classi riguardanti la gestione del file in un package a parte chiamato FileManager, mi sono messo a scrivere l'interfaccia: un frame contenente una JTextArea e un JButton (l'area di testo contiene il testo del file e il bottone consente di salvare nel file il contenuto dell'area di testo).

Ho implementato tutto in una sola classe MainFrame che implementa l'interfaccia ActionListener e funziona senza problemi, il metodo ActionPerformed non fa altro che utilizzare la classe FileManager passandogli il contenuto dell'area di testo e il percorso del file su cui salvare (istanzio new FileManager() dentro il metodo).

Ora quello che mi chiedo è, nel caso volessi creare una interfaccia più complessa (molti più pannelli, bottoni e quindi ascoltatori), come mi devo organizzare.

Mi spiego meglio:

Vorrei racchiudere l'area di testo e il bottone in una classe 'Pannello' a parte che estende JPanel e richiamare la classe pannello dal costruttore di MainFrame (per rendere tutto più ordinato).
Vorrei creare una classe SalvaListener a parte che implementa ActionListener e associarla al bottone di salvataggio.

Il problema è che devo passare all'ascoltatore il contenuto dell'area di testo (della classe Pannello) e il path del file di testo (della classe MainFrame) che servirà alla classe FileManager.

Vorrei evitare di dover passare il path in questo modo:
Mainframe -> Pannello -> SalvaListener -> FileManager (troppi passaggi credo e troppo disordine)
Inoltre se poi volessi creare un'altra classe JMenuBar (da richiamare in MainFrame) con un tasto 'salva' da associare alla classe SalvaListener come gli passo il contenuto dell'area di testo (che trovo in Pannello) e il path (che trovo nel MainFrame)?

Spero di essere stato chiaro, se ci sono problemi mi metto a fare anche lo schema delle classi. Il mio problema è prettamente organizzativo, vorrei che le classi siano abbastanza indipendenti, per cui non mi piace passare parametri dappertutto. Essendo la mia prima interfaccia non so proprio come organizzarla..
__________________
Aeroengine II BBA Black | Asus P5N-T Deluxe 780i | Intel E8400 C0 @4,050Ghz 1,35v + TR Ultra-120 eXtreme | Corsair 2x2GB PC6400 XMS2 DHX @900Mhz 2,15v | XFX 8800 GT 512MB @730/990 + TR HR-03 Rev. A | Tagan TG500-BZ | Zalman ZM-MFC2 Fan Control | WD Raptor 10000rpm 150 GB + 1,5TB | Iiyama ProLite E2607WSV

Ultima modifica di LacioDromBuonViaggio : 29-05-2009 alle 09:47.
LacioDromBuonViaggio è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 09:48   #2
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
...puoi creare una classe main che inizializza le varie classi che compongono la struttura e riceve da queste comandi e dati...

...ciao Andrea...
ally è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 10:11   #3
LacioDromBuonViaggio
Senior Member
 
L'Avatar di LacioDromBuonViaggio
 
Iscritto dal: Jul 2008
Città: Sardegna
Messaggi: 1005
Quote:
Originariamente inviato da ally Guarda i messaggi
...puoi creare una classe main che inizializza le varie classi che compongono la struttura e riceve da queste comandi e dati...

...ciao Andrea...
Grazie Andrea (bel nome ), in effetti una classe Main c'è già (non MainFrame). Però questa classe (contenente il metodo static void main) non fa altro che istanziare la classe MainFrame dell'interfaccia (contenuta nela package GUI) e basta (infatti sinceramente mi sembra un pò sprecata).

Quindi il tuo consiglio qual'è? Inizializzare, oltre alla classe MainFrame, anche tutte le altre classi (FileManager,Pannello,SaveListener,...) nel main principale?
Quindi sarà il main che comanda... Però come le faccio dialogare?
Nel senso che dovrò associare comunque il bottone salva di Pannello all'ascoltatore SaveListener, il quale dovrà poi utilizzare la classe FileManager per salvare.. Come posso fare tutto dal main?
__________________
Aeroengine II BBA Black | Asus P5N-T Deluxe 780i | Intel E8400 C0 @4,050Ghz 1,35v + TR Ultra-120 eXtreme | Corsair 2x2GB PC6400 XMS2 DHX @900Mhz 2,15v | XFX 8800 GT 512MB @730/990 + TR HR-03 Rev. A | Tagan TG500-BZ | Zalman ZM-MFC2 Fan Control | WD Raptor 10000rpm 150 GB + 1,5TB | Iiyama ProLite E2607WSV
LacioDromBuonViaggio è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 10:26   #4
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
...allora io creerei una classe main non annegata nello static main...mh...vediamo di fare un esempietto...

Codice:
public class Programma implements CustomEventListener{
	
	private FinestraPrincipale finestraPrincipale;
	private FinestraSecondaria finestraSecondaria;
        private GestoreFile gestoreFile;
	

public static void main(String[] args) {
		
		new Programma();
		
	}
	
	public Programma(){
		
		try{
			inizializzaStrati();
                        visualizzaLayout();
			
		}catch(Exception e){
			
		}
	}

public void inizializzaStrati(){
		
		this.finestraPrincipale = new FinestraPrincipale();
		this.finestraPrincipale.addMyEventListener(this);

this.finestraSecondaria = new FinestraSecondaria();
		this.finestraSecondaria.addMyEventListener(this);

this.gestoreFile = new GestoreFile();
		
	}

public void visualizzaLayout(){

this.finestraPrincipale.setVisible(true);

}

public void performedEvent(CustomEvent e) {
		
		System.out.println("event performed "+e.getFire());

if(e.getFire().equals("salva"))
(
String testo = this.finestraPrincipale.prendiTesto();
String path = this.finestraSecondaria.prendiPath();
this.gestoreFile.salvaFileDiTesto(testo,path)


		
	)
}
}
...molto in sinto una classe madre che inizializza gli strati e in base agli eventi ricevuti dall'interfaccia esegue i comandi...in questo modo l'interfaccia si preoccupa solo di fare l'interfaccia...così come la calsse gestoreFile si preoccupa solo di gestire i file (salvataggio,editing etc etc...)...

...ciao Andrea...
ally è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 10:38   #5
LacioDromBuonViaggio
Senior Member
 
L'Avatar di LacioDromBuonViaggio
 
Iscritto dal: Jul 2008
Città: Sardegna
Messaggi: 1005
Quote:
Originariamente inviato da ally Guarda i messaggi
...molto in sinto una classe madre che inizializza gli strati e in base agli eventi ricevuti dall'interfaccia esegue i comandi...in questo modo l'interfaccia si preoccupa solo di fare l'interfaccia...così come la calsse gestoreFile si preoccupa solo di gestire i file (salvataggio,editing etc etc...)...

...ciao Andrea...


Si si, bello bello.. Proprio quello che mi serviva, metterò subito in pratica..
Una domanda: quindi questa classe main attraverso performedEvent(CustomEvent e) e l'eventuale getFire() mi consente di gestire tutti gli eventi generati dall'interfaccia?
Come e dove associo i bottoni/pulsanti/MenuItem al metodo performedEvent?
__________________
Aeroengine II BBA Black | Asus P5N-T Deluxe 780i | Intel E8400 C0 @4,050Ghz 1,35v + TR Ultra-120 eXtreme | Corsair 2x2GB PC6400 XMS2 DHX @900Mhz 2,15v | XFX 8800 GT 512MB @730/990 + TR HR-03 Rev. A | Tagan TG500-BZ | Zalman ZM-MFC2 Fan Control | WD Raptor 10000rpm 150 GB + 1,5TB | Iiyama ProLite E2607WSV
LacioDromBuonViaggio è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 10:48   #6
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
...bella domanda...il giochino dovrebbe funzionare così...

...classe CustomEvent un bean per trasportare il messaggio :

Codice:
public class CustomEvent extends EventObject {
	
	String fire;
	
    public CustomEvent(Object source,String fire) {
		super(source);
		this.fire = fire;
	}
    
	public String getFire() {
		return this.fire;
	}
	public void setFire(String fire) {
		this.fire = fire;
	}
}
...l'interfaccia custom event listener :

Codice:
public interface CustomEventListener extends EventListener{

	public void performedEvent(CustomEvent e);
	
}
...la porzione di codice per scatenare gli eventi...da annegare nell'interfaccia grafica o in qualsiasi altra classe che debba "farsi sentire"...

Codice:
private ArrayList listeners = new ArrayList();
	
	public void addMyEventListener(CustomEventListener listener) {
		this.listeners.add(listener);
	}
	
	private  void launchEvent(String fire) {
		
		CustomEvent event = new CustomEvent(this,fire);
		
		for(int i = 0; i < this.listeners.size(); i++) {
	((CustomEventListener)this.listeners.get(i)).performedEvent(event);
		}
	}
...infine la porzione di codice per abilitare l'ascoltatore...va annegata nella classe ascoltatore...nel tuo caso nella classe Programma...

Codice:
public class Programma implements CustomEventListener{

...

public void inizializzaStrati(){
		
		this.finestraPrincipale = new FinestraPrincipale();
		this.finestraPrincipale.addMyEventListener(this);

		
	}

...

public void performedEvent(CustomEvent e) {
		
		System.out.println("event performed "+e.getFire());

}

...
...spero di non aver scritto stupidaggini...

...ciao Andrea...
ally è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 15:04   #7
LacioDromBuonViaggio
Senior Member
 
L'Avatar di LacioDromBuonViaggio
 
Iscritto dal: Jul 2008
Città: Sardegna
Messaggi: 1005
Prima di mettere in pratica il tutto vorrei capire bene come funziona (non mi piace copiare e incollare )
La classe CustomEvent è stata creata per poter usufruire della variabile fire, e questo è chiaro.
Ho dei problemi a capire il funzionamento del terzo blocco, quelo da inserire nelle classi che devono farsi sentire (finestraprincipale?).

Dalla classe principale Programma, chiamando this.finestraPrincipale.addMyEventListener(this); vuol dire che tutti gli eventi di finestraPrincipale saranno ascoltati dalla classe Programma?

Per quanto riguarda il metodo launchEvent hai detto che è da annegare nelle classi che devono farsi sentire, (quindi nel nostro caso parliamo di finestraprincipale??).
Però non riesco a capirlo... sembra che crei un solo evento e poi scateni tutti gli eventi registrati in precedenza. Ma se io ho il classico JButton come e a cosa lo associo per farlo funzionare?

Nell'istruzione CustomEvent event = new CustomEvent(this,fire); il this serve solo come source perchè la classe CustomEvent estende EventObject che si inizializza con un Oggetto Sorgente (visto che poi differenziamo gli eventi tramite il getFire e non il getSource() )?
__________________
Aeroengine II BBA Black | Asus P5N-T Deluxe 780i | Intel E8400 C0 @4,050Ghz 1,35v + TR Ultra-120 eXtreme | Corsair 2x2GB PC6400 XMS2 DHX @900Mhz 2,15v | XFX 8800 GT 512MB @730/990 + TR HR-03 Rev. A | Tagan TG500-BZ | Zalman ZM-MFC2 Fan Control | WD Raptor 10000rpm 150 GB + 1,5TB | Iiyama ProLite E2607WSV

Ultima modifica di LacioDromBuonViaggio : 29-05-2009 alle 15:13.
LacioDromBuonViaggio è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2009, 09:59   #8
LacioDromBuonViaggio
Senior Member
 
L'Avatar di LacioDromBuonViaggio
 
Iscritto dal: Jul 2008
Città: Sardegna
Messaggi: 1005
Ho copiato quello che mi hai suggerito.

Ho creato un nuovo package Listeners contenente l'interfaccia CustomEventListener e CustomEvent.

Dalla classe Programma ho aggiunto la finestraPrincipale come 'da ascoltare' e poi in finestraPrincipale ho creato l'ArrayList di ascoltatori (ma è giusto metterlo qui?) e i due metodi di aggiunta e di lancio.

Ora però come devo fare per dirgli che al click del bottone quello deve lanciare launchEvent in modo che poi dalla classe Programma me lo ascolti??
Devo creare un altro ascoltatore che lancia il meotodo launchEvent?

Sono bloccato qui.. Anche perchè certe cose (tipo il ciclo for) non le ho capite proprio..

--- EDIT

Ho provato una soluzioncina un pò così.

In pratica dichiaro che la finestraPrincipale implementa ActionListener, nel costruttore di finestraPrincipale creo il bottone salva e poi dichiaro this come ascoltatore.
All'interno del metodo actionPerformed metterò launchEvent(e.getActionCommad()), in modo che il fire diventi il contenuto del bottone (cosa che sinceramente non mi piace però come fare altrimenti?)...
Così funziona ma è il giusto modo di lavorare?

Altra cosa che mi chiedo è se la funzione launchEvent devo sempre ripeterla in ogni classe che deve farsi sentire. Visto che è sempre uguale non posso dichiararla d qualche altra parte (ma dove? :P) e passargli solo l'arrayList? Che poi questo ArrayList a cosa serve? Alla fine l'arrayList di finestraPrincipale conterrà solo l'istanza della classe Programma (visto che non c'è nessun altra classe che 'comanda'), o forse non va messo lì?
__________________
Aeroengine II BBA Black | Asus P5N-T Deluxe 780i | Intel E8400 C0 @4,050Ghz 1,35v + TR Ultra-120 eXtreme | Corsair 2x2GB PC6400 XMS2 DHX @900Mhz 2,15v | XFX 8800 GT 512MB @730/990 + TR HR-03 Rev. A | Tagan TG500-BZ | Zalman ZM-MFC2 Fan Control | WD Raptor 10000rpm 150 GB + 1,5TB | Iiyama ProLite E2607WSV

Ultima modifica di LacioDromBuonViaggio : 01-06-2009 alle 10:14.
LacioDromBuonViaggio è offline   Rispondi citando il messaggio o parte di esso
Old 03-06-2009, 07:52   #9
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
...scusa ho avuto un lungo week end...si la soluzione di agganciare il fireEvent all'action performed del tasto è corretta...per quanto riguarda l'arrayList...si penso si possa omettere...se la sostituisci con un oggetto customEventListener...il fine dell'arraylist è quello di agganciare il listener dell'ascoltatore con la classe che deve lanciare la notifica...sia che tu usi l'arrayList sia che tu usi il customEventListener penso non sia possibile spostare tale codice in altre parti...quando infatti inizializzi la classe che lancia l'evento il secondo step da fare è appunto aggiungere l'ascoltatore :

this.finestraPrincipale.addMyEventListener(this);

...ciao Andrea...
ally è offline   Rispondi citando il messaggio o parte di esso
Old 03-06-2009, 17:18   #10
LacioDromBuonViaggio
Senior Member
 
L'Avatar di LacioDromBuonViaggio
 
Iscritto dal: Jul 2008
Città: Sardegna
Messaggi: 1005
Grazie mille per il tuo aiuto! Ora riesco a gestire tutto quello che vogli dalla classe Main.

Ho un problemino però, sto implementando il giochino dell'impiccato (prova d'esame di Febbraio ), quando uno vince o perde compare un JOptionPane con le opzioni ESCI e GIOCA ANCORA. Per il primo caso nessun problema, per il secondo invece non ho idea di come resettare il MainFrame e renderlo come all'inizio.

Mi basterebbe rimuovere l'istanza dell'oggetto per poi fare di nuovo new MainFrame, però non so come rimuovere l'istanza (ho pensato finalize() ma è un metodo protected e non posso più estendere niente).

Ho provato con:
Codice:
mainframe.setVisible(false); 
mainframe = new Mainframe();
mainframe.setVisible(true);
e funziona bene ma non sono sicuro che sia il metodo giusto.. il garbage collector si rende conto che la vecchia istanza non viene usata e, di conseguenza, si preoccupa di eliminarla?

EDIT: ho trovato anche il metodo dispose() che dovrebbe finire il lavoro.. no?
__________________
Aeroengine II BBA Black | Asus P5N-T Deluxe 780i | Intel E8400 C0 @4,050Ghz 1,35v + TR Ultra-120 eXtreme | Corsair 2x2GB PC6400 XMS2 DHX @900Mhz 2,15v | XFX 8800 GT 512MB @730/990 + TR HR-03 Rev. A | Tagan TG500-BZ | Zalman ZM-MFC2 Fan Control | WD Raptor 10000rpm 150 GB + 1,5TB | Iiyama ProLite E2607WSV

Ultima modifica di LacioDromBuonViaggio : 03-06-2009 alle 18:40.
LacioDromBuonViaggio è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2009, 10:19   #11
ally
Bannato
 
L'Avatar di ally
 
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
...non hai modo di resettare il giochino piuttosto che riavviare l'intera interfaccia grafica?...resettare le variabili di punteggio e di visualizzazione?...

...ciao Andrea...
ally è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
DAZN Full in sconto a partire da 19,99 e...
iPhone 18 Pro disponibile su Amazon a 1....
ECOVACS T90 OMNI a 439€ e T90 MAX OMNI a...
Questa Proscenic è la scopa elett...
Microsoft Defender: falso allarme sull'a...
Aerei in volo e truppe pronte all'assalt...
Usano Claude per hackerare OpenAI: ricer...
RatHat: il nuovo malware Android usa il ...
Domanda di petrolio in calo di 2,5 milio...
Il meglio delle offerte weekend Amazon a...
Dopo oltre 100 anni di tentativi, l'IA d...
Speciale robot aspirapolvere in offerta ...
L'IA sta cancellando i lavori junior? Il...
Debutta Chery Italia: non più sol...
Addio ai dischi? Xbox ci aveva già...
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: 15:48.


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