Newsgroup: it.comp.java
Titolo: Label selezionata in un Popupmenu

Ho costruito un albero su ogni foglia del quale, compare un popup menù.
Questo popup ha più righe (più label). Quando compare il popup io posso
selezionare un certo label: come faccio, ad esempio, a stampare il contenuto
di quella label? Per riferirmi alla label selezionata devo usare un
PopupListener? Non posso usare un ItemListener in un Popup vero? Qualcuno
può scrivermi la codifica del Listener perfavore?
Grazie per l'aiuto
Francesca





Dopo numerose prove, alla fine ho usato un 
ActionListener: il programma viene compilato ma non gira. Mi è dato 
l'errore: 


 
Exception in thread "main" 
java.lang.NullPointerException                                   
 at 
ProvaPopTwo.(init)(ProvaPopTwo.java:123)                                                 
at ProvaPopTwo.main(ProvaPopTwo.java:185)


 


Sotto è riportato il codice del 
programma.


Qualcuno può darmi una mano?


Grazie in anticipo,


Francesca


 


il codice é:


 


//Creates a JFrame containing a JTree component 
with pop-up menus for each node


 


import java.awt.*;
import 
java.awt.event.*;
import javax.swing.*;
import 
javax.swing.tree.*;
import javax.swing.event.*;


 


 


 


class ProvaPopTwo extends 
JFrame
                          
implements ActionListener
{
    private int frameWidth = 
350;
    private int frameHeight = 200;
    
private int numberRows = 5;


 


    private JPopupMenu 
jpopx;
    private JTree treePop;
    
private JScrollPane jscroll;
    private TreePath selectedPath 
= null;
    private DefaultMutableTreeNode selectedNode = 
null;
private JMenuItem menu1,menu2,menu3;


 


    public ProvaPopTwo()
    {


 


 


 


// Creo i nodi
DefaultMutableTreeNode component 
=
      new 
DefaultMutableTreeNode("Radice");
    DefaultMutableTreeNode 
container =
new DefaultMutableTreeNode("Figlio");
    
DefaultMutableTreeNode box =
new DefaultMutableTreeNode( "Figlia" 
);
    DefaultMutableTreeNode jComponent 
=
      new 
DefaultMutableTreeNode("Nipote");
    DefaultMutableTreeNode 
child =
      new 
DefaultMutableTreeNode("Nipotino");


 


// Costruisco la gerarchia
    
component.add(container);
    
component.add(box);
    
container.add(jComponent);
    container.add(child);


 


  treePop = new JTree(component);
 


 


  System.out.println("costruito ");


 


  
 // MouseListener VVMouseListener = new 
VVMouseAdapter();
//treePop.addMouseListener(VVMouseAdapter);


 


//class VVMouseAdapter implements 
ActionListener
 treePop.addMouseListener(new MouseAdapter()
  
{
    public void mouseReleased(MouseEvent 
e)
                       

                         

    {
 


 


//per selezionare nodo con tasto destro
 int selectedRow = 
treePop.getRowForLocation(e.getX(),e.getY());
  
((JTree)e.getComponent()).setSelectionRow(selectedRow);
System.out.println("costruito 
forzatura");


 


try  {
         
selectedPath = 
treePop.getPathForLocation(e.getX(),e.getY());
         
selectedNode = (DefaultMutableTreeNode) 
selectedPath.getLastPathComponent();


 


System.out.println("costruito path");
      
}


 


 catch (Exception ex) {     

            
selectedPath =null; 

             
System.out.println( "Non sono sul nodo" 
);
        
}
             

      
if(e.isPopupTrigger())
      
{
      System.out.println( "A" 
);
System.out.println(selectedPath);


 


 if (selectedPath 
==null)
        
{
            
System.out.println( "Fuori dall'albero" 
);
         
}
else
      {   


 


if(treePop.getPathForLocation(e.getX(),e.getY()).equals(selectedPath))
         
{
             
System.out.println( "B" 
);
             
System.out.println( selectedNode.getUserObject().getClass().getName() );


 


JPopupMenu jpopx = new JPopupMenu();


 


JMenuItem menu1= new 
JMenuItem(selectedNode.toString()+1);
//menu.addActionListener(this);
jpopx.add(menu1);


 


menu2 = new 
JMenuItem(selectedNode.toString()+2);
jpopx.add(menu2);
menu3 = new 
JMenuItem(selectedNode.toString()+3);
jpopx.add(menu3);
                
jpopx.show( treePop, e.getX(), e.getY() );


 


             
} 
      } 
      
}
    }


 


  });


 


menu1.addActionListener(this);
menu2.addActionListener(this);
menu3.addActionListener(this);


 


 System.out.println("fine primo Listener");
//try 
// 
{
//jpopx.addMouseListener(new MouseAdapter()
 // {
 // 
public void mouseClicked(MouseEvent e)
 //{
////if 
(e.getPath(e.getX(),e.getY()).toSring = jpopx.getLabel)  {
// 
System.out.println(jpopx.getLabel().toString()); 
// // }
//} 


 


//}); 
//  } 
//catch (Exception ex) 
{
//System.out.println("NON FUNZIONA 2o LISTENER");
// 
}
 
  addWindowListener(new WindowAdapter(){ 

    public void windowClosing(WindowEvent e) 

    { 
      dispose(); 

      System.exit(0); 
    } 

  });


 


 


 


    jscroll = new JScrollPane(treePop);


 


    getContentPane().add(jscroll);


 


//  getContentPane().setLayout(new FlowLayout());
//  
getContentPane().add(treePop);


 


      //Expand the 
tree
      for(int cnt = 0; cnt < numberRows; 
cnt++)
        
treePop.expandRow(cnt);


 


      setTitle("JTree with Pop-Up 
Menus");
      setSize( frameWidth, frameHeight 
);
      setVisible(true);


 


  }//constructor


 


 


 


public void actionPerformed(ActionEvent e)  {
JMenuItem source = 
(JMenuItem)(e.getSource());
String s = 
source.getText();
 System.out.println(s);
} 


 


  public static void main(String[] args) 
  { 

    ProvaPopTwo provaPop = new ProvaPopTwo();
  
}//main


 


}//ProvaPopTwo


 


 



 ...
Non è grave, c'è solo un problema nel modo in cui aggiungi l'ActionListener
ai JMenuItem del popup menu. Non puoi mettere le istruzioni:
menu1.addActionListener(this);
menu2.addActionListener(this);
menu3.addActionListener(this);
fuori dal corpo del metodo mouseReleased() del MouseListener perché le
istanze corrispondenti non sono ancora valide (il MouseListener non è ancora
stato eseguito) e quindi i riferimenti sono null (da cui l'errore
NullPointerException).
Devi spostare queste istruzioni all'interno del MouseListener, subito dopo
la costruzione del popup menu:
...
menu2 = new JMenuItem(selectedNode.toString()+2);
jpopx.add(menu2);
menu3 = new JMenuItem(selectedNode.toString()+3);
jpopx.add(menu3);
 // eccoli!
menu1.addActionListener(myFrame);
menu2.addActionListener(myFrame);
menu3.addActionListener(myFrame);
jpopx.show( treePop, e.getX(), e.getY() );
...
A questo punto serve un'altra modifica. Il riferimento passato al metodo
addActionListener non può essere this perché si riferirebbe alla inner class
anonima che definisce il MouseListener. Ti serve invece un riferimento al
JFrame che implementa ActionListener, quindi devi definire un riferimento
alla classe derivata da JFrame (ProvaPopTwo) e passarlo ad
addActionListener.
Il riferimento va definito come attributo globale della classe ProvaPopTwo
ed inizializzato nel costruttore della medesima:
...
private ProvaPopTwo myFrame ;
    public ProvaPopTwo()
    {
       myFrame = this ;
      ...
Vedrai che così tutto funzionerà come ti aspetti.
Marco.
--
Per scrivermi direttamente elimina
__TOGLIMI__ dall'indirizzo e-mail.