Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Resettare un jPanel

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    31

    Resettare un jPanel

    Salve a tutti ragazzi
    Ho bisogno del vostro aiuto... nel mio programma ho un jPanel che comprende una serie di elementi che vengono modificati dall'utente (campi e aree di testo che vengono riempite, bottoni che si attivano/disattivano, combobox)
    Alla fine delle operazioni vorrei che premendo un pulsante, l'utente possa rifare tutto da zero.
    Non riesco però a trovare un modo per resettare l'intero pannello riportandolo alle condizioni iniziali, senza dover impostare i componenti uno ad uno. Ho provato initComponents() ma mi resetta solo i campi di testo, i bottoni e le aree no. Qualche suggerimento? Grazie mille in anticipo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Naomi92 Visualizza il messaggio
    Non riesco però a trovare un modo per resettare l'intero pannello riportandolo alle condizioni iniziali, senza dover impostare i componenti uno ad uno.
    E quanti sono? 5? 15? 40? Se il numero è "ragionevole", non me ne farei assolutamente un problema e realizzerei qualcosa tipo:

    codice:
    public void resetContent() {
        textfield1.setText("");
        textarea1.setText("");
        checkbox1.setSelected(false);
        // .....
    }

    e lo invocherei da costruttore (o initComponents ... o quello che è che crea la gui) e poi lo re-invocherei ogni qual volta serve in altri eventi.

    Se poi vuoi si possono fare logiche più generiche del tipo: dato un Container, scansionarlo "in profondità", cercare es. i JTextField (e resettarli) ecc... Ma bisognerebbe valutare e stabilire dei criteri (es. cosa si fa con le liste? e con i radiobutton?).
    Una generalizzazione del genere sarebbe appropriata in contesti più grandi e/o dove magari si intende anche realizzare uno strato al di sopra di Swing (es. classe MyTextField che estende JTextField aggiungendo una proprietà con il valore di "default"). Qui avrebbe perfettamente senso.

    Ad ogni modo non lo vedo come un "problema", è una cosa che richiede solo un po' di logica e buon senso. Nessun IDE ti suggerirebbe o aiuterebbe in queste scelte di "design".
    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
    Registrato dal
    Apr 2015
    Messaggi
    31
    Quote Originariamente inviata da andbin Visualizza il messaggio
    E quanti sono? 5? 15? 40? Se il numero è "ragionevole", non me ne farei assolutamente un problema e realizzerei qualcosa tipo:

    codice:
    public void resetContent() {
        textfield1.setText("");
        textarea1.setText("");
        checkbox1.setSelected(false);
        // .....
    }

    e lo invocherei da costruttore (o initComponents ... o quello che è che crea la gui) e poi lo re-invocherei ogni qual volta serve in altri eventi.

    Se poi vuoi si possono fare logiche più generiche del tipo: dato un Container, scansionarlo "in profondità", cercare es. i JTextField (e resettarli) ecc... Ma bisognerebbe valutare e stabilire dei criteri (es. cosa si fa con le liste? e con i radiobutton?).
    Una generalizzazione del genere sarebbe appropriata in contesti più grandi e/o dove magari si intende anche realizzare uno strato al di sopra di Swing (es. classe MyTextField che estende JTextField aggiungendo una proprietà con il valore di "default"). Qui avrebbe perfettamente senso.

    Ad ogni modo non lo vedo come un "problema", è una cosa che richiede solo un po' di logica e buon senso. Nessun IDE ti suggerirebbe o aiuterebbe in queste scelte di "design".
    Mi piacerebbe poter applicare una logica generica almeno per quanto riguarda le aree di testo.
    Proverò a creare un metodo che, dati i componenti di un JPanel, se sono TextArea o TextFields resetta il contenuto. I bottoni ovviamente andranno reimpostati uno ad uno...
    Grazie della risposta

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    31
    Ho provato a creare questo metodo, ma purtroppo funziona solo sui JTextField, non sulle JTextArea.

    codice:
    public void reset(Component[] comp){
           
            for (Component component : comp) {
                
                if (component instanceof JTextField || component instanceof JTextArea) {
                JTextComponent text = (JTextComponent) component;
                text.setText("");
            }  else if(component instanceof JScrollPane){
                    JScrollPane scroll = (JScrollPane) component;
                    Component[] components1 = scroll.getComponents();
                    reset(components1);
                }
    
    
    }
    }
    Cliccando su un bottone, poi, chiamo la funzione sullo specifico pannello:
    codice:
    reset(jPanel1.getComponents());
    Dove sbaglio?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Naomi92 Visualizza il messaggio
    Dove sbaglio?
    Io avrei fatto un

    public void reset(Container container)

    In AWT/Swing un java.awt.Container è-un java.awt.Component e contiene N Component. Dato un Container, puoi ottenere l'array dei Component contenuti. Se uno dei Component è realmente un Container, puoi invocare ricorsivamente il tuo reset. È appunto in questo modo che si può scansionare la GUI in "profondità".

    Riguardo JScrollPane, è un po' più particolare. Dentro JScrollPane ci sono diversi componenti (tra cui le due possibili scrollbar). Volendo ignorare la struttura standard e considerando solo il componente messo come "view", basta usare:

    scrollpane.getViewport().getView()

    che ti fornisce il Component. Idem come sopra, potrebbe essere un Container .... e idem stesso discorso di prima.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    31
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Io avrei fatto un

    public void reset(Container container)

    In AWT/Swing un java.awt.Container è-un java.awt.Component e contiene N Component. Dato un Container, puoi ottenere l'array dei Component contenuti. Se uno dei Component è realmente un Container, puoi invocare ricorsivamente il tuo reset. È appunto in questo modo che si può scansionare la GUI in "profondità".

    Riguardo JScrollPane, è un po' più particolare. Dentro JScrollPane ci sono diversi componenti (tra cui le due possibili scrollbar). Volendo ignorare la struttura standard e considerando solo il componente messo come "view", basta usare:

    scrollpane.getViewport().getView()

    che ti fornisce il Component. Idem come sopra, potrebbe essere un Container .... e idem stesso discorso di prima.

    Perfetto, ho realizzato un semplice metodo ricorsivo che riceve come parametro il container e se trova jTextFIeld o jTextArea esegue una setText(""), mentre se trova un altro container riapplica il metodo. Sembra funzionare, senza nemmeno dover tirare in ballo JScrollPane.
    Grazie mille, come sempre

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.