PDA

View Full Version : Java, puntatori e adapter...


cn73
24-02-2004, 13:38
Mi sono scontrato con uno strano problema:


class RicercaBloccatiAction extends AbstractAction
{


JMenuItem tempItem ;

RicercaBloccatiAction()
{
super("Allegati bloccati");

}

public void actionPerformed(ActionEvent e)
{
tempItem = (JMenuItem)e.getSource();
...
....

TrovaAllegatiBloccatiFrame trovaAllegatiBloccatiFrame = new TrovaAllegatiBloccatiFrame(...);

tempItem.setEnabled(false);

System.out.println("appena disabilitato" + tempItem.getText());

desktop.add(trovaAllegatiBloccatiFrame);
trovaAllegatiBloccatiFrame.moveToFront();

trovaAllegatiBloccatiFrame.addInternalFrameListener(new InternalFrameAdapter()
{
public void internalFrameClosing(InternalFrameEvent ife) {

tempItem.setEnabled(true);
System.out.println("appena abilitato" + tempItem.getText());
svuotajInternalFrameVector();
}
});
}
}

Praticamente a fronte della scelta da un menu dovevo aprire alcune JInternalFrame e disabilitare
la relativa voce di menu...per poi rabilitarla alla chiusura. Bene, questo codice non mi funzionava!
tempItem puntava sempre all'ultimo menu, nonostante ogni voce avesse un


tempMenuItem.addActionListener(new RicercaBloccatiAction());


Ho dovuto creare una classe

class myListener implements InternalFrameListener {

JMenuItem menuItem;

public myListener(JMenuItem menuItem) {
this.menuItem = menuItem;
}


public void internalFrameClosing(InternalFrameEvent e) {
menuItem .setEnabled(true);
System.out.println("appena abilitato" + menuItem .getText());
svuotajInternalFrameVector();
}

public void internalFrameActivated(InternalFrameEvent e) {}
public void internalFrameClosed(InternalFrameEvent e) {}
public void internalFrameDeactivated(InternalFrameEvent e){}
public void internalFrameDeiconified(InternalFrameEvent e) {}
public void internalFrameIconified(InternalFrameEvent e) {}
public void internalFrameOpened(InternalFrameEvent e) {}
}


e aggiungre il listener (e non l'adapter) al frame:

myListener listener = new myListener(tempItem);
trovaAllegatiBloccatiFrame.addInternalFrameListener(listener);


Dato che nell'altro topic vi siete intrippati con i puntatori e le zone di memoria, mi sapete spiegare questa??
DIversa gestione dei puntatori negli adapter?'

Passy
25-02-2004, 12:43
Interessante Up

anx721
25-02-2004, 14:01
Sicuramente sbagli qlcosa da qlche altra parte, quel codice funziona benissimo:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
import javax.swing.border.*;


class RicercaBloccatiAction extends AbstractAction
{

JDesktopPane desktop;
JMenuItem tempItem ;

RicercaBloccatiAction(JDesktopPane desktop)
{
super("Allegati bloccati");
this.desktop = desktop;

}

public void actionPerformed(ActionEvent e)
{
tempItem = (JMenuItem)e.getSource();

TrovaAllegatiBloccatiFrame trovaAllegatiBloccatiFrame = new TrovaAllegatiBloccatiFrame(tempItem.getText());
trovaAllegatiBloccatiFrame.setSize(150, 150);
trovaAllegatiBloccatiFrame.setVisible(true);


tempItem.setEnabled(false);

System.out.println("appena disabilitato" + tempItem.getText());

desktop.add(trovaAllegatiBloccatiFrame);
trovaAllegatiBloccatiFrame.moveToFront();

trovaAllegatiBloccatiFrame.addInternalFrameListener(new InternalFrameAdapter()
{
public void internalFrameClosing(InternalFrameEvent ife) {

tempItem.setEnabled(true);
System.out.println("appena abilitato" + tempItem.getText());

}
});
}
}


class TrovaAllegatiBloccatiFrame extends JInternalFrame{

public TrovaAllegatiBloccatiFrame(String title){
super(title,
true, //resizable
true, //closable
true, //maximizable
true);//iconifiable
}
}


public class Ciao extends JFrame{

JDesktopPane desktop;

public Ciao(){
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

desktop = new JDesktopPane();
getContentPane().add(desktop);
setTitle("Ciao");
setSize(340, 340);

JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("uffa");
JMenuItem item = new JMenuItem("ciao 1");
item.addActionListener(new RicercaBloccatiAction(desktop));
menu.add(item);
bar.add(menu);

item = new JMenuItem("ciao 2");
item.addActionListener(new RicercaBloccatiAction(desktop));
menu.add(item);

item = new JMenuItem("ciao 3");
item.addActionListener(new RicercaBloccatiAction(desktop));
menu.add(item);

getContentPane().add(bar, "North");

setLocation(0, 0);
validate();
show();

}

public static void main(String[] args){
new Ciao();

}
}



ciao.

cn73
25-02-2004, 15:31
mmm...c'è da dire che il problema ce l'ho sotto java 1.1.8...mi sa che era un bacuzzo...

anx721
25-02-2004, 15:39
Non saprei, ma mi sembra strano che ci sia un simile bug, comqunue io suo 1.4.2.

Ad ogni modo prova a salvare il codice di esempio che ti ho mandato in un file Ciao.java e mandalo in esecuzione per vedere se ti funziona pure a te,

ciao

cn73
26-02-2004, 09:24
L'unica cosa che cambia è che i menù da disattivare e attivare li creo dinamicamente in base ad una query, con questa funzione:


protected void populateMenu(String query,ActionListener menuAction, String actionCommand, JMenu menu ){

String tempString[]={""};
try
{
Vector result = dbsSelect.select(query,true,-1);
JMenuItem tempMenuItem;

if(result.size()!=0)
{
for(int i=0; i<result.size(); i++)
{
tempString=(String[])result.elementAt(i);
if(tempString[0].length()!=0)
{
tempMenuItem=new JMenuItem(tempString[0]);
tempMenuItem.addActionListener(menuAction);
tempMenuItem.setActionCommand(actionCommand);
menu.add(tempMenuItem);
}
}
result.removeAllElements();
result = null;
}
else
menu.add(new JMenuItem("no entry found"));
}
catch(Exception exp)
{
System.out.println("impossibile creare uno dei menu degli allegati: "+exp.toString()+tempString[0]);
JOptionPane.showMessageDialog(this,"Si è verificato qualche errore durante la creazione del menù degli atti inviati e in iter...\n"+
"Il problema non dovrebbe impedire il normale svolgimento delle operazioni");
}

}