Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543

    logica nell'uso di una GUI e repaint()

    Salve, mi sto creando una interfaccia con Swing ma essendo la prima volta forse penso di essere in un vicolo cieco
    allora...
    ho un JMenu dove quando seleziono un item richiama un metodo
    codice:
    		public void actionPerformed(ActionEvent evt) {
    			Object source = evt.getActionCommand();
    			if(source.equals(nuovoBrano)) nuovo();
    			if(source.equals(modificaBrano)) modifica();
    			if(source.equals(apriBrano)) apri();
    			if(source.equals(salva)) salva();
    			if(source.equals(esci)) chiudi();
    		}
    la struttura della gui è
    programma ->Jframe
    titolo -> Jlabel in Jframe
    body -> JFrame

    quando richiamo uno dei metodi...esempio nuovo() non faccio altro che cancellare il contenuto di body e aggiungere i componenti che voglio e aggiornando il titolo
    codice:
    	labTitolo.setText("Nuovo titolo");
    	body.removeAll();
    	JPanel riga = new JPanel();
    	riga.setLayout(null);
    	riga.setPreferredSize(new Dimension(programma.getSize().width, 30));
    	JTextField titoloBrano = new JTextField();
    	titoloBrano.setBounds(programma.getSize().width-360, 4, 350, 22);
    	titoloBrano.setFont(new Font(f.getFontName(), 0, 18));
    	formTitolo = new JLabel("Titolo label");
    	formTitolo.setSize(150, 30);
    	formTitolo.setFont(new Font(f.getFontName(), 0, 20));
    	riga.add(formTitolo);
    	riga.add(titoloBrano);
    	body.add(riga);
    e fin qui non ho problema...poi con gli altri metodi, come salva, poichè la definizione dei JTextField è esterna ai metodi (interna alla classe), non ho problemi a recuperare il contenuto dei componenti che mi interessano....
    ora...il problema nasce al resize
    codice:
    programma.addComponentListener(new ComponentListener(){
    	public void componentResized(ComponentEvent arg0) {
    		programma.repaint();
    		}
    });
    ma la posizione dei componenti che sono dentro nuovo() non si modifica...come posso fare? La logica di strutturazione di una GUI a più pagine è corretta?
    Mi scuso per la lunghezza del post ma non riuscivo a essere più conciso

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Modificare un "container" ovvero rimuovere/aggiungere componenti dopo che il container è già visibile, è una cosa un po' delicata. Perchè bisogna rivalidare il container. Dipende anche dal layout manager usato (con GridBagLayout ad esempio non sembra, almeno per la mia esperienza personale, banale). Per layout semplici, es. BorderLayout, GridLayout, BoxLayout basta fare un validate() sul container.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    Originariamente inviato da andbin
    Modificare un "container" ovvero rimuovere/aggiungere componenti dopo che il container è già visibile, è una cosa un po' delicata. Perchè bisogna rivalidare il container. Dipende anche dal layout manager usato (con GridBagLayout ad esempio non sembra, almeno per la mia esperienza personale, banale). Per layout semplici, es. BorderLayout, GridLayout, BoxLayout basta fare un validate() sul container.
    sì è molto semplice...ho aggiunto validate() al body nella funzione nuovo dopo aver aggiunto e rimosso componenti....non è cambiato nulla...quando invoco il repaint in seguito al ComponentResized sul JFrame la posizione degli elementi del body resta invariata! come risolvo?
    ho provato a fare un validate sul JFrame ma non cambia nulla...non posso purtroppo richiamare il metodo poichè se i JTextField sono stati già compilati si svuoterebbero

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da oronze
    sì è molto semplice...ho aggiunto validate() al body nella funzione nuovo dopo aver aggiunto e rimosso componenti....non è cambiato nulla...
    Il validate() serve se il container sta usando un layout manager ... ma se hai tolto il layout manager non ti è utile (ti serve invece repaint()).

    Originariamente inviato da oronze
    quando invoco il repaint in seguito al ComponentResized sul JFrame la posizione degli elementi del body resta invariata! come risolvo?
    Ma se hai tolto il layout manager, allora hai posizionato e dimensionato tu i componenti nel container .... e se vuoi che al resize del container vengano riposizionati/ridimensionati (con una qualche logica) i componenti .... devi farlo tu ... è tutto a tuo carico.
    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 L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    grazie...ho modificato leggermente il layout e ora funziona correttamente

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

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 © 2026 vBulletin Solutions, Inc. All rights reserved.