Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Rimuovere JPanel Con Jbutton

    Buona sera!

    Il mio programma crea dei jPanel su un contenitore che è Anch'esso un jpanel e fin qui tutto ok.
    All'interno di ogni Jpanel creato c'è un jbutton che premendolo dovrebbe rimuovere il Jpanel su cui si trova..
    Per rimuovere il pannello chiamo il metodo JPanelcontenitore.remove(); ma tra le parentesi dovrei inserire il componente da rimuovere o l'indice del componente da rimuovere.... Come faccio ad avere questa informazione? l'ideale sarebbe avere un metodo del genere: JButton.getContenitore, in modo che mi torni il Jpanel su cui è disposto il Jbutton e dunque possa rimuoverlo con tranquillità....
    Ricapitolando devo rimuovere con un bottone il jpanel su cui il bottone si trova, quidi vorreti fare contenitoreradice.remove(Jpanel_da_rimuovere). grazie

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Se dai un'occhiata alla javadoc di JButton scoprirai che, essendo un JComponent, dispone del metodo getParent()
    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
    Il problema è che i pannelli sono creati dinamicamente da un metodo: RIPORTO IL CODICE::

    codice:
    private void aggiungi_pannello() {
    		
    
    		JPanel Pcella = new JPanel();
    		JList lista=new JList();
    		
    		Conv_cliente.add(conversazione);									//mi salvo la conversazione presa in carico
    		Jlist_clienti.add(lista);										//mi salvo la lista
    		
    		
    		JScrollPane scrollTweet= new JScrollPane(lista);
    		
    		lista.setListData(conversazione.toArray());
    		
    		Pcella.setLayout(new BorderLayout());
    		
    		
    		scrollTweet.setPreferredSize(new Dimension(300,200));
    		
    		Pcella.add(scrollTweet,BorderLayout.CENTER);					//ogni Pannello cella ha scroll e bottone
    		
    		
    		JButton B_DelConv = new JButton("ARCHIVIA");
    		JButton Riduci = new JButton("RIDUCI");
    		
    		
    		B_DelConv.setBackground(Color.red);
    		Riduci.setBackground(Color.blue);
    		
    		Pcella.add(Riduci,BorderLayout.NORTH);
    		Pcella.add(B_DelConv,BorderLayout.SOUTH);
    		
    		Riduci.addActionListener(new Riduci_Jlist());
    		B_DelConv.addActionListener(new archivia_cliente());
    		
    		
    		if(X==1){														//inserisco in le celle nella posizione corretta del pannello 
    			
    			X=0;
    			Y=Y+1;
    			
    			c.gridx=X;
    			c.gridy=Y;
    			
    			QueryResult.add(Pcella,c);
    			
    		}else{
    			
    			X=X+1;
    			
    			
    			c.gridx=X;
    			c.gridy=Y;
    			
    			QueryResult.add(Pcella,c);
    			
    			
    			
    		}
    		
    
    		
    		invalidate();												//aggiornamento
    		validate();
    		repaint();
    		
    		
    		
    	}
    	
    	
    }
    La cosa interessante è che questo metodo è chiamato da un button e dunque è all'interno di un Action Listner e fin qui ok!!
    Ora vedete che ogni pannello che crea questo metodo ha 2 jbutton?? come faccio a dire che questo jbutton deve rimuovere il pannello in cui esso (button) si trova? all'interno di ::

    codice:
    class Riduci_Jlist implements ActionListener{
    	
    	public void actionPerformed (ActionEvent e){
    
    	//qui non posso usare le variabili del jpanel infatti se facessi
           //Jbutton Riduci.getParent(); non è visibile....
    
    }
    }
    Dunque è possibile con un jButton creato su un pannello dinamicamente cancellare il pannello?? Sembra davvero difficile..

    In alternativa se facessi un unico bottone fuori da c***o potrei selezionare con il mouse il pannello che voglio cancellare e cancellarlo?? grazie

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    E' gradito l'uso del tag CODE o quello che posti diventa illeggibile

    Ho qualche dubbio sul "design" che hai scelto ma sorvoliamo.

    actionPerformed() ha un parametro che contiene informazioni sull'evento. In particolare il metodo getSource() ti restituisce l'oggetto che ha generato l'evento (il JButton ad esempio).
    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
    ok ho risolto... Dunque per cancellare un componente tramite un buttone su di esso uno dei possibili metodi (forse nn il iù raffinato ) è questo:

    codice:
    class archivia_cliente implements ActionListener{  	public void actionPerformed (ActionEvent e){  	JButton b= (JButton)e.getSource();							// ritorna Object che ha lanciato l'eccezzione (il bottone) 	Container comp=b.getParent();								//ritorna il Conteiner del bottone 	QueryResult.remove(comp);									//rimuovo il suddetto conteiner dal jpanel 	 	validate();													//refresh 	repaint(); 	 	} 	 }


    Grazie mille

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Il tag CODE andrebbe scritto a mano, il pulsante serve solo ad inserire una singola riga di codice (è abbastanza inutile, lo so )

    Qualche suggerimento:

    1. gli ActionListener ti consiglio di usarli come classi anonime, è più compatto e semplifica l'accesso agli altri campi che potrebbero servirti (a meno che lo stesso identico ActionListener non ti serva, esattamente identico, in altri pulsanti)

    2. i commenti: evita di commentare l'ovvio! Appesantisci la lettura e basta (in particolare se commenti a fianco e non prima) Se proprio vuoi scrivere cosa fa un pezzo di codice fallo all'inizio di quel codice, tutto assieme.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Grazie Alex per le tue dritte!
    Non mi è molto chiaro però cosa intendi per classi anonime nell' ActionListener.. Perché accederei più facilmente a altri attributi? Perché se più pulsanti lo adottano non andrebbe più bene?

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    http://docs.oracle.com/javase/tutori...usclasses.html

    Ad esempio:

    codice:
    public class MyFrame extends JFrame 
    { 
        private int numClick = 0;
    
        public MyFrame() 
        { 
            JButton button = new JButton("Click me!");
            ...
            button.addActionListener(new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    System.out.println("Hai cliccato " + (++numClick) + " volte");
                }
            });
    
            ...
        }
    }
    In questo modo aggiungi l'azione direttamente al pulsante. Se hai 10 pulsanti dovrai aggiungere a ciascuno la propria azione: se l'azione è la stessa, a questo punto la metti in una classe a parte altrimenti ognuno ha la sua. Usando una classe a parte però non hai visibilità all'interno della classe che contiene il componente che lancia l'azione: se devi toccare degli attributi devi passare il riferimento. Con una classe INTERNA anonomina se già nella classe...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Originariamente inviato da Alex'87
    Usando una classe a parte però non hai visibilità all'interno della classe che contiene il componente che lancia l'azione
    Beh, si risolve facilmente con una nested class, che assorbe i benefici sia della inner anonymous class, che della classe esterna:

    codice:
    public class MiaFinestra extends JFrame {
    
       private class Ascoltatore implements ActionListener {
          @Override
          public void actionPerformed(ActionEvent ae) {
             System.out.println("Hai cliccato " + (++numClicks) + " volte");
          }
       }
    
       ...
       private int numClicks;
       private JButton[] bottoni;
       private Ascoltatore mioListener = new Ascoltatore();
       ...
    
       public MiaFinestra() {
    
          for(int idx=0; idx<10; idx++) {
             bottoni[idx] = new JButton( ... );
             bottoni[idx].addActionListener( mioListener );
          }
          ...
    
       }
    }
    La classe Ascoltatore accede senza problemi alla variabile privata numClicks e a qualunque altro membro della classe MiaFinestra. In più ho una sola istanza di tale classe, riducendo notevolmente il consumo di memoria per i listener dei pulsanti.

    C'è anche una terza opzione: far implementare ActionListener direttamente alla classe MiaFinestra. In questo caso ci si risparmia proprio l'uso di una seconda classe, ma, ovviamente, tutto dipende dal tipo di applicazione che si deve sviluppare.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.