Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10

    Problema con classe interna anonima ActionListener

    Salve a tutti,
    ho un problema con il passaggio di una variabile dalla classe esterna alla classe interna anonima ActionListener. Mi spiego meglio. Ho una classe Main in cui nel menu apri seleziono un file (JFileChooser) e lo salvo in una stringa fileName; richiamo la classe ApriFile passandole la stringa. All'interno di ApriFile ho un pulsante analizza che fa l'analisi al file caricato da ApriFile. Quando clicco su analizza mi apre un JFrame e mi visualizza l'analisi. Fin qui tutto ok. Il problema sorge quando dalla Main riapro un secondo file. ApriFile va bene, ma quando clicco su analizza la variabile stringa rimane sempre la stessa facendomi l'analisi del file precedente. A quanto ho potuto capire è un problema di ciclo di vita dell'oggetto String nella classe interna perché stampando gli hashcode, la prima volta sono uguali mentre al secondo file variano. Qualcuno mi sa consigliare qualcosa?
    grazie
    Non può piovere per sempre...

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Questa stringa è un attributo della classe interna o è una variabile locale del metodo actionPerformed()?

    (posta il codice)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10
    E' una variabile di istanza della classe esterna che viene richiamata nell' actionPerformed() come variabile locale
    Ultima modifica di dafcon; 24-06-2014 a 11:30
    Non può piovere per sempre...

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Ripeto, posta il codice altrimenti non possiamo capire cosa succede nel tuo programma...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non per rompere le palle ma... potresti renderlo leggibile, indentando e usando il tag CODE?G
    Grazie
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10
    Si certo scusami....

    codice:
    public class ApriARFF extends JPanel {// implements ActionListener {
    	private JTextField relazioneT; 
    	private JTextField istanzeT;
    	private JTextField attributiT;
    
    	/**
    	 * Create the panel.
    	 */
    	public ApriARFF(String relation, Enumeration attributi, Enumeration istanze,String file) {
    		
    		setLayout(null);
    		
    		this.relation=relation;
    		this.attributi=attributi;
    		this.istanze=istanze;
    		this.fileName=file;
    		
    	
    		
    		JPanel caratteristicheArff = new JPanel();
    		caratteristicheArff.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "caratteristiche arff", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    		caratteristicheArff.setBounds(10, 26, 436, 107);
    		add(caratteristicheArff);
    		caratteristicheArff.setLayout(null);
    		
    		JLabel relationL = new JLabel("Relazione");
    		relationL.setBounds(24, 25, 60, 14);
    		caratteristicheArff.add(relationL);
    		
    		JLabel istanceL = new JLabel("Istanze");
    		istanceL.setBounds(24, 68, 60, 14);
    		caratteristicheArff.add(istanceL);
    		
    		JLabel attributiL = new JLabel("Attributi");
    		attributiL.setBounds(229, 25, 60, 14);
    		caratteristicheArff.add(attributiL);
    		
    		relazioneT = new JTextField();
    		relazioneT.setBounds(94, 22, 86, 20);
    		caratteristicheArff.add(relazioneT);
    		relazioneT.setColumns(10);
    		relazioneT.setText(relation);
    		
    		istanzeT = new JTextField();
    		istanzeT.setBounds(94, 62, 86, 20);
    		caratteristicheArff.add(istanzeT);
    		istanzeT.setColumns(10);
    		
    		attributiT = new JTextField();
    		attributiT.setBounds(288, 22, 86, 20);
    		caratteristicheArff.add(attributiT);
    		attributiT.setColumns(10);
    		
    		
    		JPanel contenutoArff = new JPanel();
    		contenutoArff.setBorder(new TitledBorder(null, "contenuto arff", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    		contenutoArff.setBounds(10, 156, 436, 257);
    		add(contenutoArff);
    		
    		JTextArea areaTesto = new JTextArea();
    		JScrollPane scroll1;
    		contenutoArff.setLayout(new BorderLayout(0, 0));
    		
    		scroll1 = new JScrollPane(areaTesto,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    		scroll1.setLayout(new ScrollPaneLayout());
     
    		contenutoArff.add(scroll1);
    				
    		areaTesto.setBounds(10, 23, 388, 223);
    		areaTesto.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    		
    		//contenutoArff.add(areaTesto);
    		
    		int count=0;
    		
    		while(this.attributi.hasMoreElements())
    		{
    			areaTesto.append(attributi.nextElement().toString()+"\n");
    			count++;
    		}
    		
    		attributiT.setText(String.valueOf(count));
    		count=0;
    		areaTesto.append("@data \n");
    		while(this.istanze.hasMoreElements())
    		{
    			areaTesto.append(istanze.nextElement().toString()+"\n");
    			count++;
    		}
    		istanzeT.setText(String.valueOf(count));
    		
    		JPanel regoleAssociative = new JPanel();
    		regoleAssociative.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "regole associative", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    		regoleAssociative.setBounds(473, 26, 167, 386);
    		add(regoleAssociative);
    		regoleAssociative.setLayout(null);
    		
    		JLabel tipoDiAlgoritmo = new JLabel("Tipo di algoritmo:");
    		tipoDiAlgoritmo.setBounds(10, 39, 130, 23);
    		regoleAssociative.add(tipoDiAlgoritmo);
    		
    		JComboBox scegliAlgoritmoC = new JComboBox();
    		scegliAlgoritmoC.setModel(new DefaultComboBoxModel(new String[] {"", "Apriori"}));
    		scegliAlgoritmoC.setBounds(10, 73, 147, 23);
    		regoleAssociative.add(scegliAlgoritmoC);
    		
    		JButton analizzaB = new JButton("analizza");
    		analizzaB.setBounds(36, 352, 89, 23);
    		regoleAssociative.add(analizzaB);
    		
    		
    		
    		System.out.println(this.fileName);// qui ho il valore corretto di fileName
    
    		AprioriControllore g=new AprioriControllore(this.fileName);
    		
    		analizzaB.addActionListener(g);
    		
    		
    	}
    	class AprioriControllore implements ActionListener
    	{
    		public AprioriControllore(String f)
    		{
    			a=f;
    			System.out.println("interno "+a);// qui ho il valore corretto di fileName
    		}
    		public void actionPerformed(ActionEvent e)
    		{
    			AprioriVista a=new AprioriVista(this.a);
    			System.out.println("actionPerformed: "+this.a);//valore scorretto, riferito all'oggetto string precedente
    		}
    		private String a;
    	}
    	
    	 private String relation;
    	private Enumeration attributi;
    	private Enumeration istanze;
    	private String fileName;
    	
    	
    }
    Non può piovere per sempre...

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Beh, da quel che si vede tu stai creando un unico AprioriControllore la cui variabile a (parentesi, nome pessimo) viene inizializzata col valore di f (altro nome pessimo) e... fine.

    Quel valore non verrà mai più modificato.
    O crei un nuovo listener ogni volta o rivedi un attimo l'architettura in modo da poter aggiornare il valore di a.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10
    Per i nomi pessimi concordo con te, ma ho riscritto il codice diverse volte in forme diverse e per questioni di rapidità ho preferito così... :-) . Sul resto permettimi qualche riflessione. D'accordo sul fatto che creo un solo oggetto AprioriControllore ma questo viene istanziato ogni volta che richiamo la classe ApriARFF. Difatti quando vengono eseguite le println() che mi stampano il valore della variabile nella classe AprioriControllore la variabile di istanza ha il valore corretto e, la stessa variabile passata come parametro nel metodo actionPerformed(...), assume il valore precedente. Non riesco a spiegarmi come mai...
    Comunque grazie, ti sto rubando tempo :-D

    codice:
    classAprioriControlloreimplementsActionListener
        {
            publicAprioriControllore(String f)
            {
                a=f;
                System.out.println("interno "+a);// qui ho il valore corretto di fileName
            }
            publicvoid actionPerformed(ActionEvent e)
            {
                AprioriVista a=newAprioriVista(this.a);
                System.out.println("actionPerformed: "+this.a);//valore scorretto, riferito all'oggetto string precedente
            }
            privateString a;
        }
    Non può piovere per sempre...

Tag per questa discussione

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.