Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    75

    [JAVA SWING] Problema multithreading

    Salve a tutti,
    avrei una domanda da fare. Stavo cominciando a fare delle prove su come far muovere dei componenti swing (in particolare pannelli con al loro interno altri componenti) in un JFrame principale.

    Per il caso singolo ci sono riuscito quasi senza problemi: ho creato la finestra principale senza layout manager, ed ho creato una classe mioPannello, che estende JPanel, la quale contiene altri componenti impostati con dei layout. Ho fornito la classe mioPannello del metodo move() che semplicemente mi sposta di un pixel verso il basso il mioPannello. Poi per testare ho creato una classe con main in cui creo il frame principale, creo il mioPannello e poi metto in un for le chiamate al metodo move() del mioPannello e il repaint() del frame principale con una sleep tra una iterazione e l'altra. Questo funziona, ovvero se ad esempio il for va da 0 a 10, vedrò il mioPannello che scorre nel frame di 10 pixels verso il basso.

    Ora mi servirebbe un'idea per ampliare questo scenario ed avere magari un pulsante con il quale posso far nascere e scorrere un altro mioPannello mentre anche il primo sta scorrendo, e così via per potenzialmente n pannelli in movimento. La cosa importante è poter aggiungere pannelli che scorrano insieme a runtime.

    Grazie mille.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    multithreading + SWING = ricorda di usare l'EDT!!!

    Ora vuoi simulare un movimento di questo tipo, non è più funzionale usare paint?
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    75
    Originariamente inviato da valia
    multithreading + SWING = ricorda di usare l'EDT!!!

    Ora vuoi simulare un movimento di questo tipo, non è più funzionale usare paint?
    Ciao, grazie per la risposta, però non sei molto chiaro...
    Inoltre paint non posso usarlo perché io non sto disegnando figure ma JPanel all'interno di un frame principale.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA SWING] Problema multithreading

    Originariamente inviato da gatsu85
    avrei una domanda da fare. Stavo cominciando a fare delle prove su come far muovere dei componenti swing (in particolare pannelli con al loro interno altri componenti) in un JFrame principale.

    La cosa importante è poter aggiungere pannelli che scorrano insieme a runtime.
    Per capire e valutare se è una buona soluzione, dovresti prima precisare il motivo di questa richiesta. Forse è per realizzare un gioco in cui ci sono svariate "entità" che si muovono in modi e tempi arbitrari?
    Se è così ... allora quella non è la soluzione! La soluzione migliore sarebbe come minimo quella di avere un unico pannello in cui si fa del custom painting, in pratica disegni tu tutto il contenuto.
    Questo comporta tipicamente l'uso di strutture dati apposite per tenere le informazioni sulle varie entità da muovere, comporta di certo l'uso di un "timer" (per cose non troppo sofisticate basta un javax.swing.Timer) e richiede una buona/valida conoscenza del painting sui Graphics e dei concetti relativi alla "concorrenza" in Swing (EDT e il suo uso).

    E questo sempre a meno che tu voglia realizzare grafica ad alte prestazioni, per cui sarebbe necessario sfruttare un'altra API come ad esempio la Full-Screen Exclusive Mode API.

    Ma ripeto: è meglio che precisi e chiarisci ... prima di "partire in quinta".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    75

    Re: Re: [JAVA SWING] Problema multithreading

    Originariamente inviato da andbin
    Per capire e valutare se è una buona soluzione, dovresti prima precisare il motivo di questa richiesta. Forse è per realizzare un gioco in cui ci sono svariate "entità" che si muovono in modi e tempi arbitrari?
    Se è così ... allora quella non è la soluzione! La soluzione migliore sarebbe come minimo quella di avere un unico pannello in cui si fa del custom painting, in pratica disegni tu tutto il contenuto.
    Questo comporta tipicamente l'uso di strutture dati apposite per tenere le informazioni sulle varie entità da muovere, comporta di certo l'uso di un "timer" (per cose non troppo sofisticate basta un javax.swing.Timer) e richiede una buona/valida conoscenza del painting sui Graphics e dei concetti relativi alla "concorrenza" in Swing (EDT e il suo uso).

    E questo sempre a meno che tu voglia realizzare grafica ad alte prestazioni, per cui sarebbe necessario sfruttare un'altra API come la Full-Screen Exclusive Mode API.

    Ma ripeto: è meglio che precisi e chiarisci ... prima di "partire in quinta".
    Okay spiego lo scenario: io devo realizzare una interfaccia grafica che mostri degli oggetti (che arriveranno a runtime ed io devo rappresentare) questi oggetti hanno un identificativo e delle informazioni al loro interno. Quindi io avevo pensato di modellarli come pannelli in modo tale da inserire ad esempio le informazioni in jtextfield e mostrarle cosi come l'identificativo del pannello. In modo tale da gestire la selezione di un informazione e associarvi degli eventi, ad esempio quando clicco su una Jtextfield ottengo un determinato comportamento dell'interfaccia e mandero un comando verso chi mi aveva inviato l'oggetto da mostrare. Questi oggetti arriveranno a runtime e avranno un tempo massimo di vita, cioè mi arrivano e io so che ho 20 minuti per interagire con tale oggetto. Per questo motivo scorreranno dall'alto verso il basso in un frame in cui sulla siniztra visualizzerò una barra temporale ai quali i vari pannelli saranno legati con una linea, che mi indica il tempo che manca alla scomparsa del pannello. Questo è quello che dovrei ottenere, non riesco a spiegarmi meglio.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    75
    Ragazzi rispolvero questa discussione, perché qualcosa sono riuscito a fare ma ho ancora dei problemini di visualizzazione.

    Allora, spiego meglio il punto in cui sono arrivato:

    1) Ho un JFrame principale in cui ho settato il layout a null (quindi nel frame vado a posizionare a mano quello che voglio).

    2) Ho creato una classe di nome Conflict che estende JPanel (quindi gli oggetti Conflict sono a tutti gli effetti dei JPanel)

    3) Ho aggiunto una classe ConflictRunnable che implementa Runnable e serve a creare nuovi thread che fanno muovere i pannelli Conflict in questo modo:

    codice:
    public class ConflictRunnable implements Runnable
    {
    	//il pannello che passo qui è il contentPane del frame principale
    public ConflictRunnable(Conflict aConflict, Component aPanel)
    	{
    		conflict = aConflict;
    		panel = aPanel;
    	}
    	
    	public void run()
    	{
    		
    		for(int i = 0; i < panel.getMaximumSize().getHeight(); i++)
    		{
    			
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			conflict.move();
    			panel.repaint();
    		}
    	}
    	
    	private Component panel;
    	private Conflict conflict;
    }
    Tale classe la utilizzo nel metodo addConflict della classe che rappresenta il frame principale, tale metodo addConflict è fatto così:

    codice:
    public void addConflict(Conflict aConflict)
    	{
    
    		contentPanel.add(aConflict);
    		Runnable r = new ConflictRunnable(aConflict, contentPanel);
    		Thread t = new Thread(r);
    		t.start();
    		
    	}
    Il metodo addConflict lo chiamo alla pressione di un JButton inserito nel frame principale, praticamente quando clicco il JButton viene creato un nuovo oggetto Conflict (che ricordo è un JPanel) e viene chiamato il metodo addConflict.

    Il problema che riscontro è il seguente: l'architettura pare funzionare, riesco ad aggiungere pannelli Conflict cliccando il pulsante ma di tali pannelli non vedo il contenuto, vedo solo il Border dei pannelli che si muove. Qualcuno sa spiegarmi perché?

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    sicuro che non ci sono eccezioni di nessun tipo?
    Inoltre, da quanto vedo il tuo pannello è vuoto, se non aggiungi niente cosa speri di disegnare a video?
    RTFM Read That F*** Manual!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    75
    Originariamente inviato da valia
    sicuro che non ci sono eccezioni di nessun tipo?
    Inoltre, da quanto vedo il tuo pannello è vuoto, se non aggiungi niente cosa speri di disegnare a video?
    Scusami da cosa lo vedi che il mio pannello è vuoto se il codice del pannello (ovvero la classe conflict) non l'ho riportata?
    Comunque ti assicuro che il pannello che inserisco non è vuoto. Anche perché il problema dei pannelli vuoti appare solo quando provo ad aggiungere pannelli a run time premendo il pulsante. Se lo stesso pannello lo inserisco al momento della creazione della finestra principale fila tutto liscio come l'olio.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    allora da quello che vedo (che sono i fatti) per me il pannello è vuoto e quindi è normale che disegni il tutto vuoto.
    Per quanto riguarda il repaint, bisogna che il frame principale si ridisegni e queste operazioni forzate dal thread che tu hai lanciato (quindi non EDT) non sono tanto pulite (e questo te lo diciamo fin dall'inizio).

    Poi non mi dici nemmeno se ci sono eccezioni oppure no (sempre che tu ne faccia un catch e ne visualizzi lo stack trace)
    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    75
    Originariamente inviato da valia
    allora da quello che vedo (che sono i fatti) per me il pannello è vuoto e quindi è normale che disegni il tutto vuoto.
    Per quanto riguarda il repaint, bisogna che il frame principale si ridisegni e queste operazioni forzate dal thread che tu hai lanciato (quindi non EDT) non sono tanto pulite (e questo te lo diciamo fin dall'inizio).

    Poi non mi dici nemmeno se ci sono eccezioni oppure no (sempre che tu ne faccia un catch e ne visualizzi lo stack trace)
    Non ho eccezioni, il tutto gira, l'unico problema è quello che ho detto, i pannelli aggiunti con il pulsante vengono visualizzati vuoti, cioè solo con il bordo.

    Io sinceramente continuo a non capire da cosa deduci che i pannelli siano vuoti, il codice che ho postato mostra soltanto la classe ConflictRunnable che rappresenta i thread che faranno muovere i pannelli, quindi usa pannelli già creati, non ho mostrato come li creo perché sono banalissimi panneli con dentro dei JTextField e JButton, e il metodo addConflict della finestra principale che mostra come faccio partire i Thread per far muovere i pannelli all'interno del frame principale.
    Inoltre non capisco neanche la tua citazione dell'EDT visto che l'unico metodo che chiamo dai thread esterni alla GUI, ovvero quelli che fanno muovere i pannelli, chiamano solo la repaint() che come saprai è uno dei pochi metodi thread safe di Swing.

    Capisco che posso essere stato poco chiaro e mi scuso di ciò, ma sono qui per cercare di capire qualcosina. Ringrazio te e chiunque abbia voglia di discutere insieme.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.