Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: JComboBOx che attiva altri elementi

  1. #1
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310

    JComboBOx che attiva altri elementi

    Salve a tutti,

    ho una JComboBox definito così
    codice:
    private void createCombo() {		String[] typeStrings = { "   ", "I", "D", "A" };
    		comboBox = new JComboBox(typeStrings);
    	}
    vorrei che quando clicco sull'item I deve abilitarsi una texField che segue la combo, ho assegnato un listner al comboBox in questo modo

    codice:
    private void verifyComboBox() {
    
    
    		ItemListener itemListener = new ItemListener(){
    			@Override
    		    public void itemStateChanged(ItemEvent event) {
    		       if (event.getStateChange() == ItemEvent.SELECTED) {
    		          Object item = event.getItem();
    		          if(item.equals("I")){
    		        	 textField.setEnabled(true);
    		          }else{
    		        	  textField.setEnabled(false);
    		          }
    		       }
    		    }   
    		};
    		comboBox.addItemListener(itemListener);
    	}
    Entrambi i metodi li richiamo nel costruttore del JDialog che li contiene.
    Dove sbaglio?

    Grazie a tutti

  2. #2
    Quote Originariamente inviata da cerza Visualizza il messaggio
    Entrambi i metodi li richiamo nel costruttore del JDialog che li contiene.
    Dove sbaglio?
    A vista .. nulla, il codice di per sé pare corretto. Può esserci altro che qui non si vede ...

    Comunque se non serve davvero la informazione "fine" sul cambio di stato, generalmente è più comodo un ActionListener.
    Andrea, www.andbin.net – Senior Java developer – SCJP 5 (91%) – SCWCD 5 (94%)
    Il mio blog sulla programmazione

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    346
    Bisognerebbe vedere come invochi i metodi, ma se dici che li chiami nel costruttore della dialog dovrebbe andare bene ...
    Riesci a postare più codice ?

  4. #4
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie Ansharja,

    alla fine il codice, compreso di costruttore è questo:
    codice:
    public StationDialog(ViewStationsFrame vsf) {		this.viewfs = vsf;
    		this.control = vsf.getControl();
    		this.model = vsf.getModel();
    		this.createCombo();
    		this.verifyComboBox();
    
    
    	}
    	
    	private void createCombo() {
    		String[] typeStrings = { "   ", "I", "D", "A" };
    		comboBox = new JComboBox(typeStrings);
    	}
    
    
    
    
    	private void verifyComboBox() {
    
    
    		ItemListener itemListener = new ItemListener(){
    			@Override
    		    public void itemStateChanged(ItemEvent event) {
    		       if (event.getStateChange() == ItemEvent.SELECTED) {
    		          Object item = event.getItem();
    		          if(item.equals("I")){
    		        	  textField.setEnabled(true);
    		          }else{
    		        	  textField.setEnabled(false);
    		          }
    		       }
    		    }   
    		};
    		comboBox.addItemListener(itemListener);
    	}
    non so quale altra parte di codice postarti, inoltre attivando il debug ed interagendo con la combo non si entra mai nel metodo itemStateChanged, come se non riconoscesse l'evento.

    Dove posso guardare?
    Grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    346
    Il codice non è ancora sufficiente in realtà, avremmo bisogno di qualcosa di completo, per vedere come aggiungi i componenti alla dialog e tutto il resto ...

    Se puoi prepara un esempio di codice che sia completo, direttamente compilabile ed eseguibile, meglio se in unico blocco (vedi qui e qui, addirittura in certi forum preparare un mvce è quasi un requisito fondamentale per avere una risposta ) perché non sapendo cosa fai nel resto del codice brancoliamo davvero nel buio ...

    Se io aggiungo al tuo codice il minimo per farlo funzionare ottengo un qualcosa di molto rozzo ma funzionante, quando seleziono un item diverso da "I" nel combobox il textfield si disattiva, altrimenti si attiva. Questo è il codice che ho usato io (ci sarebbero alcune cose dubbie o da sistemare, ma per ora vediamo di risolvere il problema), attendo il tuo

    codice:
    import java.awt.FlowLayout;
    import java.awt.event.*;
    import javax.swing.*;
    public class Main
    {
        public static void main (String [] a) {
            SwingUtilities.invokeLater (new Runnable () {
                @Override public void run () {
                    createAndShowGUI ();
                }
            });
        }
        private static void createAndShowGUI () {
            StationDialog dialog = new StationDialog (new ViewStationsFrame ());
            dialog.pack ();
            dialog.setDefaultCloseOperation (JDialog.DISPOSE_ON_CLOSE);
            dialog.setLocationRelativeTo (null);
            dialog.setVisible (true);
        }
    }
    class StationDialog extends JDialog
    {
        private JComboBox comboBox;
        private JTextField textField;
        
        public StationDialog (ViewStationsFrame vsf) {
            // this.viewfs = vsf;
            // this.control = vsf.getControl ();
            // this.model = vsf.getModel ();
            this.createCombo ();
            this.verifyComboBox ();
            getContentPane ().setLayout (new FlowLayout (FlowLayout.LEFT, 50, 200));
            add (comboBox);
            add (textField = new JTextField (20));
        }
        private void createCombo () {
            String [] typeStrings = {"   ", "I", "D", "A"};
            comboBox = new JComboBox (typeStrings);
        }
        private void verifyComboBox () {
            ItemListener itemListener = new ItemListener () {
                @Override public void itemStateChanged (ItemEvent event) {
                    if (event.getStateChange () == ItemEvent.SELECTED) {
                        Object item = event.getItem ();
                        if (item.equals ("I")) textField.setEnabled (true);
                        else textField.setEnabled (false);
                    }
                }
            };
            comboBox.addItemListener (itemListener);
        }
    }
    class ViewStationsFrame extends JFrame
    {
        public ViewStationsFrame () {
            super ();
        }
        // ?
    }

  6. #6
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie [QUOTE=Ansharja;25484141]

    non sapevo che il codice postato dovesse essere funzionante; ad ogni modo ho difficoltà a mettere tutto il codice perché il progetto è grande e con la separazione tra controllo e vista è un po' complicato creare qualcosa di funzionante, provo comunque a postare una buona parte della logica della creazione della texfield e compagni, sperando che possa essere utile per la risoluzione del problema.
    Inoltre la creazione dell'interfaccia grafica parte dalla lettura di un file csv, dal quale individua il numero di colonne.

    codice:
    private JTextField[] dataField;
    public void initComponentsForInsert(String[] names) {
    
    		this.dataField = new JTextField[names.length];
    		getContentPane().removeAll();
    		getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
    
    
    		JPanel p = new JPanel();
    		p.setLayout(new GridLayout(names.length, 2, 5, 5));
    
    
    		for (int i = 0; i < names.length - 1; i++) {
    
    
    			JLabel label;
    			if (i == 0 || i == 5 || i == 7 || i == 9 || i == 10) {
    				label = new JLabel(names[i] + " *");
    			} else {
    				label = new JLabel(names[i]);
    			}
    			label.setHorizontalAlignment(JLabel.RIGHT);
    			label.setBorder(new EmptyBorder(5, 5, 5, 5));
    			label.setName("label_" + i);
    
    
    			if (i != 4) {
    
    
    				JTextField field = new JTextField();
    				field.setColumns(20);
    				field.setName("field_" + i);
    				dataField[i] = field;
    				p.add(label);
    				p.add(field);
    
    
    			} else {
    
    
    				createCombo();
    				comboBox.setName("field_" + i);
    				p.add(label);
    				p.add(comboBox);
    
    
    			}
    		}
    
    
    		getContentPane().add(p);
    
    
    		JPanel panel_Button = new JPanel();
    		panel_Button.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
    
    
    		btn_Ok = new JButton();
    		panel_Button.add(btn_Ok);
    		btn_Ok.setAction(control.getAction(Constants.ACTION_CONFIRM_INSERT_STATION));
    
    
    		btn_Cancel = new JButton();
    		panel_Button.add(btn_Cancel);
    		btn_Cancel.setAction(control.getAction(Constants.ACTION_CANCEL_INSERT_STATION));
    
    
    		getContentPane().add(panel_Button);
    
    
    	}
    	
    	
    	
    	//Richiamo la creazione della dialog in un pannello
    	public void insertStation() {
    
    
    		StationDialog stationDialog = (StationDialog)                        viewStationsFrame.getSubView(Constants.STATION_DIALOG);
    
    
    		StationsModel stationsModel = (StationsModel) table_Stations.getModel();
    		stationDialog.initComponentsForInsert(stationsModel.columnNames);
    
    
    		stationDialog.pack();
    		stationDialog.setVisible(true);
    
    
    	}
    	
    	//Quindi nell'azione ho
    	public void actionPerformed(ActionEvent e) {
    		
    			
    		ViewStationsFrame stationsFrame = (ViewStationsFrame) this.control.getView().getSubView(Constants.VIEW_STATIONS_FRAME);
    		try {
    
    
    			StationsPanel panelStations = stationsFrame.getStationsPanel();
    			panelStations.insertStation();
    			
    		} catch (Exception ex) {
    			String msg = ex.getMessage() + System.getProperty("line.separator") + ex.getCause().toString();
    			logger.error(msg);
    			stationsFrame.windowError("Errore",  msg);
    		}
    
    
    	}
    Ad ogni modo, grazie per la disponibilità

  7. #7
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    codice:
    import java.awt.FlowLayout;
    import java.awt.event.*;
    import javax.swing.*;
    public class Main
    {
        public static void main (String [] a) {
            SwingUtilities.invokeLater (new Runnable () {
                @Override public void run () {
                    createAndShowGUI ();
                }
            });
        }
        private static void createAndShowGUI () {
            StationDialog dialog = new StationDialog (new ViewStationsFrame ());
            dialog.pack ();
            dialog.setDefaultCloseOperation (JDialog.DISPOSE_ON_CLOSE);
            dialog.setLocationRelativeTo (null);
            dialog.setVisible (true);
        }
    }
    class StationDialog extends JDialog
    {
        private JComboBox comboBox;
        private JTextField textField;
        
        public StationDialog (ViewStationsFrame vsf) {
            // this.viewfs = vsf;
            // this.control = vsf.getControl ();
            // this.model = vsf.getModel ();
            this.createCombo ();
            this.verifyComboBox ();
            getContentPane ().setLayout (new FlowLayout (FlowLayout.LEFT, 50, 200));
            add (comboBox);
            add (textField = new JTextField (20));
        }
        private void createCombo () {
            String [] typeStrings = {"   ", "I", "D", "A"};
            comboBox = new JComboBox (typeStrings);
        }
        private void verifyComboBox () {
            ItemListener itemListener = new ItemListener () {
                @Override public void itemStateChanged (ItemEvent event) {
                    if (event.getStateChange () == ItemEvent.SELECTED) {
                        Object item = event.getItem ();
                        if (item.equals ("I")) textField.setEnabled (true);
                        else textField.setEnabled (false);
                    }
                }
            };
            comboBox.addItemListener (itemListener);
        }
    }
    class ViewStationsFrame extends JFrame
    {
        public ViewStationsFrame () {
            super ();
        }
        // ?
    }
    Guarda che questo pezzo di codice l'ho provato (compila senza errori) e FUNZIONA. Ovvero se scelgo "I" il textfield si abilita e posso scriverci. Se scelgo altro, il textfield si disabilita e non posso usarlo.

    Quindi ???

    (semmai c'è un "piccolo" difetto che dovrai correggere, ovvero il textfield è abilitato fin dall'inizio, anche se l'elemento inizialmente selezionato NON è il "I").
    Andrea, www.andbin.net – Senior Java developer – SCJP 5 (91%) – SCWCD 5 (94%)
    Il mio blog sulla programmazione

  8. #8
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie [QUOTE=andbin[/QUOTE],

    a me non funziona, ho provato anche a farlo partire disabilitato ma nulla, non si abilita mai.

    Grazie ancora.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    346
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Guarda che questo pezzo di codice l'ho provato (compila senza errori) e FUNZIONA. Ovvero se scelgo "I" il textfield si abilita e posso scriverci. Se scelgo altro, il textfield si disabilita e non posso usarlo.
    Un attimo, quello è un esempio di codice che ho fatto io per mostrare a @cerza che aggiungendo il minimo necessario per far partire il suo programma l 'abilitazione/disabilitazione del field funziona.
    Come ho detto il codice è piuttosto rozzo (il JComboBox non è parametrizzato, non si capisce se abbia senso usare una dialog non vedendo il collegamento con un parent frame (anche se viene passato come parametro al costruttore) etc., volevo solo far vedere che senza informazioni in più non si può capire cosa non vada.

    Quote Originariamente inviata da cerza Visualizza il messaggio

    non sapevo che il codice postato dovesse essere funzionante; ad ogni modo ho difficoltà a mettere tutto il codice perché il progetto è grande e con la separazione tra controllo e vista è un po' complicato creare qualcosa di funzionante, provo comunque a postare una buona parte della logica della creazione della texfield e compagni, sperando che possa essere utile per la risoluzione del problema.
    Inoltre la creazione dell'interfaccia grafica parte dalla lettura di un file csv, dal quale individua il numer
    Quello che ho detto nel messaggio precedente non è una regola e in molti casi non serve nemmeno, se scrivi sul forum per avere un consiglio generale, per chiedere un aiuto su un singolo metodo (es. algoritmo/metodo che non funziona), per una domanda secca e molto altro non è necessario mettere il codice completo.

    Tuttavia quando si ha un problema legato a un interfaccia grafica o a qualcosa di più articolato di un semplice programmino, è utile poter avere a portata di mano tutto il codice rilevante.
    Nei link che ho postato si spiega che il codice dovrebbe esser minimo proprio per questo : non ha alcuna importanza che ci sia tutta la logica, ma solo la parte grafica, con i minimi componenti necessari a riprodurre il problema (quindi nel tuo caso basta UN textfield e un combobox).
    Tutto il resto può essere tolto dall esempio, e i valori letti da file/database o altro possono essere inseriti direttamente nel codice (sempre che serva).

    Nel tuo caso non si capisce ad esempio se il combo box e il textfield che usi nel listener vengano effettivamente aggiunti e dove ...

  10. #10
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie Ansharja per la pazienza,

    ok non ho capito appieno il concetto di "codice funzionante", spero di essere più chiara la prossima volta.
    In merito all'assegnazione della combo e delle textField, queste vengono aggiunte al pannello
    codice:
    p.add(field);
    p.add(comboBox);
    ed infine il pannello p viene aggiunto al
    codice:
    getContentPane().add(p);
    per cui se poteva esserci qualcosa che non andava non avrei dovuto vederle neanche a video.
    Ad ogni modo so che il codice fornito da te funziona ma non riesco a trovare il motivo per cui integrato nella mia interfaccia smette di farlo.

    Grazie ancora

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.