Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13

Discussione: Gestione jradiobutton e ButtonGroup

  1. #11
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie Ansharja,
    per la pazienza. In effetti il tuo suggerimento è stato prezioso. Adesso vorrei fare una cosa un po' assurda, ad esempio, se una checkBox è deselezionata vorrei rendere non cliccabili alcuni Jbutton di un pannello successivo a quello che contiene le check. E' possibile fare una cosa del genere? oppure dovrei fare una cosa del genere:

    codice:
    check1.addItemListener(new ItemListener() {			
    			@Override
    			public void itemStateChanged(ItemEvent e) {
    				if(e.getStateChange () == ItemEvent.SELECTED){
    				primoCheck= true;
    				}
    			}
    		});
    e poi fare i controlli sul valore del primoCheck per vedere cosa attivare e cosa no?
    Grazie ancora



  2. #12
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    357
    Certo che è possibile, in effetti non cambia molto dalla situazione di prima, magari non sarà facile farlo in maniera elegante ...

    Come sempre puoi fare la cosa in diversi modi, i suggerimenti iniziali valgono anche in questo caso: ad esempio ogni JButton potrebbe ridefinire isEnabled () ritornando true se il checkbox è selezionato, false altrimenti. Ad esempio (non creo una classe ad hoc per il bottone, si potrebbe anche fare, ma se ci sono altri motivi):

    codice:
    JButton button = new JButton (/* ... */) {
    	@Override public boolean isEnabled () {
    		return checkBox.isSelected ();
    	}
    };
    Ovviamente il JButton in questione deve avere il reference al checkbox corrispondente.

    Come prima il problema di questa soluzione è data dal fatto che selezionare/deselezionare un checkbox di per sé non costringe in alcun modo un pulsante ad "aggiornarsi", finché qualcuno non rivaliderà o richiamerà il repaint () sul pulsante (o sull'intera interfaccia, ad esempio ridimensionando il frame o con altri eventi specifici) tu non vedrai il pulsante cambiare il proprio stato. Quindi dovresti preoccuparti tu anche di questo (in teoria anche solo rivalidando l'intero content pane dovrebbe andare), e rischi che lo stato del pulsante sia "instabile" se lo fai male.

    Per estendere la soluzione di prima a questo contesto (ogni radiobutton aveva un ItemListener che chiamava il setEnabled () sul "corrispondente" textfield) potresti aggiungere al checkbox un ItemListener per ogni pulsante che crei:

    codice:
    JButton button = new JButton (/* ... */);
    checkBox.addItemListener (new ItemListener () {
    	@Override public void itemStateChanged (ItemEvent e) {
    		button.setEnabled (e.getStateChange () == ItemEvent.SELECTED);
    	}
    });
    Il codice è praticamente uguale a quello di prima, ma ripetere il codice per ogni bottone sarebbe folle, devi sempre pensare a fare la cosa in maniera automatizzata per non ripetere il codice, se il tuo "pannello successivo" fosse in un'altra classe potresti passare il reference del checkbox al costruttore di questo pannello, memorizzarlo in una variabile, e usarlo in seguito in un metodo della classe che crea un nuovo bottone sfruttando quella variabile per aggiungerci il listener.

    O magari sarebbe meglio usare l'Observer Pattern (puoi anche cercare in java.util le classi Observer e Observable), usato più o meno rigorosamente.

    In parole povere da qualche parte c'è una lista/elenco di oggetti (se lo implementi per conto tuo potresti ad esempio avere un ArrayList<JButton> nella classe MainPanel, o dove ti serve) che devono essere notificati di un cambiamento sull'oggetto che appunto "osservano" (nel tuo caso il checkbox).
    Quindi se lo fai tu potresti avere un solo ItemListener per il CheckBox, e quando viene deselezionato/selezionato andrai a modificare lo stato di tutti i bottoni in attesa, ad esempio:

    codice:
    class MainPanel extends JPanel
    {
    	private ArrayList <JButton> listaBottoni;
    	
    	// ... altre variabili
    	
    	public MainPanel () {
    		
    		// ...
    		
    		checkBox.addItemListener (new ItemListener () {
    			@Override public void itemStateChanged (ItemEvent e) {
    				boolean selected = e.getStateChange () == ItemEvent.SELECTED;
    				for (JButton button : listaBottoni) button.setEnabled (selected);
    			}
    		});
    		
    		// ...
    	}
    }
    Questa soluzione è un po' "artigiana", ma dovrebbe andare, ma perché sia pulita e funzionante dipende da come/dove creeresti i bottoni, come li aggiungeresti alla lista, etc., non ho la visione di quello che vuoi fare.

    Tra l'altro se il tuo "pannello successivo" non è visibile contemporaneamente ai checkbox (es. stai usando un CardLayout, crei una dialog successiva o quant'altro) quanto detto non servirebbe nemmeno, perché ti basterebbe "conoscere" lo stato del checkbox quando vai a creare/mostrare l'altro pannello ...

    PS: Non prendere per "teoria" questi consigli, non ho la visione completa di quello che vuoi ottenere per suggerirti la soluzione migliore, né tantomeno le competenze per insegnare a usare in modo corretto i pattern o altro, mi baso solo su un po' di esperienza e buon senso

  3. #13
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie! fatto anche questo

    Grazie di tutto

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