Java GUI, rendering componenti

di il
8 risposte

Java GUI, rendering componenti

Salve ragazzi, vi scrivo perchè ho un problema con un mio programma che presenta una GUI.

Praticamente col tema Nimbus di java funziona bene, mentre se volessi impostare il tema di Windows ecco che appaiono strane cose, tuttavia il codice funziona bene!

EDIT: mi correggo, lo fa con tutti i temi, tranne che con Nimbus!
RE-EDIT: Sembra che a partire dalla versione JDK 1.8 ci siano bug con il rendering dei componenti swing...-.-

Da cosa dipende? Potete aiutarmi? grazie!

Per spiegarvi meglio il tutto, ho fatto un piccolo video (Formato .wmv di 7MB), scaricate il video qui (Cliccate su Download Now, il player nella pagina web non funziona):

8 Risposte

  • Re: Java GUI, rendering componenti

    Francesco93 ha scritto:


    Per spiegarvi meglio il tutto, ho fatto un piccolo video (Formato .wmv di 7MB), scaricate il video qui (Cliccate su Download Now
    Ho visto il tuo video e .... beh di per sé così su 2 piedi non saprei dire se è un baco della piattaforma o del tuo codice.
    Però vedo che la schermata è abbastanza "sofisticata": immagine di sfondo ... componenti "trasparenti".
    Quindi la anzi le prime domande sono: cosa hai fatto per disegnare quella immagine (o è un gradiente?) di sfondo? Cosa hai fatto per rendere i componenti trasparenti?

    Ah, e se è coinvolto (forse.. presumo, non so) il multi-threading, hai assicurato che l'accesso alla UI sia fatto solo nel contesto del Event Dispatch Thread?

    Senza vedere il codice ne saprei come prima.
  • Re: Java GUI, rendering componenti

    Ecco a te il codice c'è un commento.
    class MyFrame extends JFrame{
    	
    	public static void main(String[] args){
    		
    		SwingUtilities.invokeLater(new Runnable() {
    	
    			public void run() {
    				
    				MyFrame app = new MyFrame();
    				
    				app.setVisible(true);
    			}
    		});
    	}
    	
    	public MyFrame(){
    		
    		createFrame();
    	}
    	
    	public void createFrame(){
    
        	 	//qui creo tutta la grafica e le modifiche vengono fatte su nuovi thread (che però accedono direttamente alle componenti grafice, sbaglio?), lo sfondo è un'immagine, i pulsanti sono trasparenti tramite l'opzione setopaque false, le textfields/textareas sono senza bordi e settate ad opaque=false.
    
    
    	}
    
  • Re: Java GUI, rendering componenti

    Francesco93 ha scritto:


    le modifiche vengono fatte su nuovi thread (che però accedono direttamente alle componenti grafice, sbaglio?)
    Se è come sto pensando, ovvero in un altro thread direttamente un es. xyzField.setText( .. ) allora sì, è sbagliato.
  • Re: Java GUI, rendering componenti

    È esattamente così..
    Puoi dirmi cosa posso fare? ti ringrazio
  • Re: Java GUI, rendering componenti

    Francesco93 ha scritto:


    è esattamente così..
    Puoi dirmi cosa posso fare? ti ringrazio
    Devi far "passare" un pezzo di codice nel EDT .... grazie al "solito" invokeLater
    Ma non è solo questo il punto. Per dire, se nel contesto di un altro thread ci sono sparpagliati 50 punti in cui devi aggiornare la UI, non è che è molto buono replicare 50 volte il invokeLater con il Runnable in anonymous inner class ... qui conta anche l'architettura generale. Devi individuare e stabilire quali sono i "punti" di aggiornamento della UI, intravedere le similitudini, eventualmente incapsulare meglio le cose.

    Insomma, conta anche il "design" delle classi. Cerca di chiarirti questi aspetti, altrimenti, te lo dico onestamente, in Swing non vai molto lontano.
  • Re: Java GUI, rendering componenti

    TI ho capito perfettamente! quindi magari potrei crearmi una classe che gestirà tramite propri metodi le componenti grafiche, questa classe implementerà una runnable, in tal modo mi basterà chiamarla una volta tramite invokelater, e userò i suoi metodi per modificare le componenti, è giusto così?
  • Re: Java GUI, rendering componenti

    Francesco93 ha scritto:


    quindi magari potrei crearmi una classe che gestirà tramite propri metodi le componenti grafiche, questa classe implementerà una runnable, in tal modo mi basterà chiamarla una volta tramite invokelater, e userò i suoi metodi per modificare le componenti, è giusto così?
    Dipende da cosa viene poi fuori realmente con il codice ... Provaci, poi se hai dubbi, chiedi pure.
  • Re: Java GUI, rendering componenti

    Dipende da cosa viene poi fuori realmente con il codice...
    Che intendi?
    ______________________________

    il problema comunque rimane :/... nel senso: se hai presente WindowBuilder, esso ha una funzione che permette di fare un'anteprima di come viene la finestra, eseguendone solo l'interfaccia grafica senza codice in più.

    Beh il problema si ripresenta anche in questo caso.

    provo a togliere le trasparenze alle textbox per capire se sono quelle il problema
Devi accedere o registrarti per scrivere nel forum
8 risposte