PDA

Visualizza la versione completa : [java]Significato eccezione java.lang.ClassCastException


tcc
15-12-2004, 16:36
Cosa significa questa eccezione,generata da un cast??


java.lang.ClassCastException
at swingtest.MenuClass.actionPerformed(MenuClass.java :97)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1786)
at javax.swing.AbstractButton$ForwardActionEvents.act ionPerformed(AbstractButton.java:1839)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:258)
at javax.swing.AbstractButton.doClick(AbstractButton. java:289)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Bas icMenuItemUI.java:1113)
at javax.swing.plaf.basic.BasicMenuItemUI$MouseInputH andler.mouseReleased(BasicMenuItemUI.java:943)
at java.awt.Component.processMouseEvent(Component.jav a:5100)
at java.awt.Component.processEvent(Component.java:489 7)
at java.awt.Container.processEvent(Container.java:156 9)
at java.awt.Component.dispatchEventImpl(Component.jav a:3615)
at java.awt.Container.dispatchEventImpl(Container.jav a:1627)
at java.awt.Component.dispatchEvent(Component.java:34 77)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3128)
at java.awt.Container.dispatchEventImpl(Container.jav a:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606 )
at java.awt.Component.dispatchEvent(Component.java:34 77)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 456)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:100)
CODICE:

public class MenuClass /*extends JDesktopPane*/ implements ActionListener{
public JMenuBar barra = new JMenuBar();
private JMenu file = new JMenu("File");
private JMenu effect = new JMenu("Effect");
private JMenuItem esci = new JMenuItem("Esci");
private JMenuItem salva = new JMenuItem("Salva");
private JMenuItem salvaas = new JMenuItem("Salva con nome");
private JMenuItem apri = new JMenuItem("Apri");
private JMenuItem inverti = new JMenuItem("Inverti");
private JMenuItem luminosita = new JMenuItem("Luminosità");
private JMenuItem contrasto = new JMenuItem("Contrasto");

private JFileChooser aprifile = new JFileChooser();
public JDesktopPane desktop = new JDesktopPane();
public JFileChooser salvafile=new JFileChooser("C:\\Programmi");
public JOptionPane pannellosalva = new JOptionPane();
private JOptionPane pannello = new JOptionPane();
public ImagePanel pannelloimmagine;
public JInternalFrame finestra;
public RenderedImage immagine;
public JSlider sld;
public JScrollPane srcimgpanel;
public DisplayJAI srcimg;
public OperationClass operazioni = new OperationClass();




public MenuClass() {
barra.add(file);
barra.add(effect);
file.add(apri);
file.add(salva);
file.add(salvaas);
file.add(esci);
effect.add(inverti);
effect.add(luminosita);
effect.add(contrasto);
apri.addActionListener(this);
salvaas.addActionListener(this);
esci.addActionListener(this);
inverti.addActionListener(this);

}

private String openFile(){
aprifile.setDialogTitle("Scegli Immagine");
aprifile.showOpenDialog (pannello);
String fileName = new String(aprifile.getSelectedFile().toString());
return fileName;
}

public void actionPerformed(ActionEvent ae) {

if(ae.getSource() == esci){
System.exit(0);
}
if(ae.getSource() == apri){
String fileName =openFile();
pannelloimmagine = new ImagePanel();
finestra = pannelloimmagine.CreatePanel(fileName);
desktop.add(finestra);

}
if(ae.getSource() == salvaas){
try{
salvafile.setDialogTitle("Inserisci percorso");
salvafile.showSaveDialog(pannellosalva);
String filesalvato = new String(salvafile.getSelectedFile().toString());
JAI.create("filestore", immagine, filesalvato, "BMP", null);
}
catch(Exception a){
System.out.println("Operazione annullata dall'utente");
}
}
if(ae.getSource() == inverti){
immagine = ((ImagePanel)desktop.getSelectedFrame()).getOrigin alImage();
if(immagine != null) {
srcimg = operazioni.Inverti(immagine);
pannelloimmagine = new ImagePanel();
finestra = pannelloimmagine.CreatePanel(srcimg);
desktop.add(finestra);

}
else{ System.out.print("errorei invert"); }

}


}



}


public class ImagePanel extends JInternalFrame
{
public JInternalFrame finestra,pan;
public JScrollPane srcimgpanel;
public DisplayJAI srcimg;
public RenderedImage imgsrc;




public ImagePanel() {


}

public JInternalFrame CreatePanel(String fileName) {
imgsrc = JAI.create("fileload", fileName);
finestra = new JInternalFrame(fileName, true, true, true, true);
finestra.setSize(640,480);
srcimgpanel = new JScrollPane();
srcimg = new DisplayJAI(imgsrc);
srcimgpanel.getViewport().add(srcimg);
setPreferredSize(new Dimension(640, 480));
finestra.getContentPane().add(srcimgpanel);
finestra.setVisible(true);

return finestra;
}



public JInternalFrame CreatePanel(DisplayJAI immagine){

finestra = new JInternalFrame("Immagine Modificata",true,true,true,true);
finestra.setSize(640,480);
srcimgpanel = new JScrollPane();
srcimgpanel.getViewport().add(immagine);
finestra.getContentPane().add(srcimgpanel);
finestra.setVisible(true);

return finestra;
}

public RenderedImage getOriginalImage() {
return imgsrc;
}


}

LeleFT
15-12-2004, 17:18
Significa che stai tentadi di effettuare un cast di un oggetto in un altro a cui non è possibile castarlo... as esempio, se tenti di castare una String in un Integer, ecc.
L'errore è in questa riga (almeno è l'unica che utilizza un cast):


immagine = ((ImagePanel)desktop.getSelectedFrame()).getOrigin alImage());

Penso che il metodo getSelectedFrame() non ritorni nu oggetto di tipo ImagePanel.


Ciao. :ciauz:

tcc
15-12-2004, 17:33
come devo fare per evitare l'eccezione?

LeleFT
15-12-2004, 17:39
No... ho sbagliato... l'errore non è lì.
Non credo che l'errore sia nel codice che tu hai postato... o almeno non lo posso correggere non conoscendo il resto del codice.
Prova a vedere in che punto del codice ottieni l'errore (quando ottieni l'errore viene anche riportata la riga di codice che l'ha generata).


Ciao. :ciauz:

tcc
15-12-2004, 18:19
Come faccio a vedere in che punto è l'errore???Scustatemi ma sono alla prime armi

LeleFT
15-12-2004, 18:22
Sotto all'errore java.lang.ClassCastException viene riportato il metodo actionPerformed() che indica la riga 97. Quella è la riga in cui si è generato l'errore. Ora, io ho provat a copiare il codice, ma non so da che riga tu abbia cominciato ne quanti spazi tu abbia tolto... fatto stà che la riga 97 non esiste all'interno della classe MenuClass. Devi vedere tu, sul tuo codice, all'interno della classe MenuClass qual è la riga 97.


Ciao. :ciauz:

tcc
15-12-2004, 18:33
ho fatto girare il programma e ho visto che l'eerore lo da in menucalss dove c'è il cast,cosa devo fare???

LeleFT
15-12-2004, 18:40
Adesso ho capito... tu aggiungi all'oggetto desktop un oggetto di tipo JInternalFrame e tendi di recuperarlo castandolo a ImagePanel.
Per fare ciò che vuoi fare tu dovresti far sì che il metodo CreatePanel() della classe ImagePanel tornasse un oggetto di tipo ImagePanel e non JInternalFrame... e per fare questo devi rivedere il codice al suo interno: tu al suo interno costruisci un JInternalFrame e lo restituisci.

Vediamo quello che fai tu:


1) Costruisci un JInternalFrame chiamando il metodo CreatePanel()
2) Lo aggiungi al desktop
3) Prelevi dal desktop il JInternalFrame e tenti di castarlo a ImagePanel

Quest'ultimo punto non puoi farlo!

Ciao. :ciauz:

tcc
16-12-2004, 10:10
Come devo fare per eseguire questo cast???

LeleFT
16-12-2004, 10:26
Vediamo, allora, di sistemare la classe ImagePanel:


public class ImagePanel extends JInternalFrame {
public JInternalFrame finestra;
public JScrollPane srcimgpanel;
public DisplayJAI srcimg;
public RenderedImage imgsrc;

public ImagePanel(String fileName) {
super(fileName, true, true, true, true);
imgsrc = JAI.create("fileload", fileName);
srcimgpanel = new JScrollPane();
srcimg = new DisplayJAI(imgsrc);
srcimgpanel.getViewport().add(srcimg);
setPreferredSize(new Dimension(640, 480));
setSize(640, 480);
getContentPane().add(srcimgpanel);
setVisible(true);
}

public ImagePanel(String fileName, DisplayJAI immagine) {
super(fileName, true, true, true, true);
srcimgpanel = new JScrollPane();
srcimgpanel.getViewport().add(immagine);
setSize(640, 480);
getContentPane().add(srcimgpanel);
setVisible(true);
}

public JInternalFrame CreatePanel(String fileName) {
return new ImagePanel(fileName);
}

public JInternalFrame CreatePanel(DisplayJAI immagine){
return new ImagePanel("Immagine Modificata", immagine);
}

public RenderedImage getOriginalImage() {
return imgsrc;
}
}

Così dovrebbe andare...

Ora devi modificare la dichiarazione di finestra all'interno del programma principale: lo devi dichiarare di tipo ImagePanel e non JInternalFrame. Tutto dovrebbe andare.


Ciao. :ciauz:

Loading