Problem z dziedziczeniem

0

Witam wszystkich,
Stworzylem sobie wlasna klase ktora dziedziczy po klasie JPanel, klasa ta sluzy do wyswietlania zaladowanego uprzednio z pliku obrazka. Moj panel wrzucam do JInternalFrame i tu mi wszystko dziala i jest ok. Problem zaczyna sie wtedy gdy chce pobrac obrazek juz wyswietlony w jednej z JInternalFrame, w mojej klasie mam metode getImage() ktora zwraca obrazek dla danego panela lecz gdy zrobie tak:

                ObrazekPane pane = (ObrazekPane) pulpit.getSelectedFrame().getContentPane();
                operacyjny = pane.getImage();

wywala mi ClassCastException co moze byc nie tak??
Mam inny sposob na rozwiazanie tego problemu ale bardzo mi zalezy zebym mogl korzystac wlasnie z metody getSelectedFrame()

0

Drodzy forumowicze,
Widze ze kilku z was juz rzucilo okiem na moj temat. Nikt nic nie mowi i to mnie martwi. Staralem opisac moj problem jak najprosciej, ale jak czegos nierozumiecie to postaram sie lepiej to napisac. Bardzo zalezaloby mi na rozwiazaniu tego problemu.

0

Pokaż troszkę więcej kodu szczególnie kod tworzący 'pulpit' (chyba jest to JInternalFrame), bo wygląda mi to próbę rzutowania w nieodpowiednim kierunku. Po prostu JPanel i JInternalFrame nie są z sobą powiązane. Próbujesz rzutować niejawnie "w górę", a potem jawnie "w dół" na inne drzewo klas od JComponent i takie podejście jest blee...

ps. niektórzy jak ja mają włączony reader RSS, który też zlicza wejścia, niektórzy nie znają się na swingu i tylko rzucają okiem na temat i olewają. Nie ma co się przejmować. Feedback na posta jest rzędu 24 godzin.

0

W koncu sie ktos zlitowal dzieki:)
Ponizej daje cala klase ramki gdzie jest pulpit... zreszta sam zobaczysz

public class Ramka extends JFrame {

    JMenuBar jMenuBar1 = new JMenuBar();
    JMenu jMenuPlik = new JMenu();
    JMenuItem jMenuPlikWyjscie = new JMenuItem();
    JMenuItem jMenuObrazek = new JMenuItem();
    JMenuItem wykrywanieKrawedzi8 = new JMenuItem();
    JFileChooser wybieracz = new JFileChooser();
    ObrazekPane oryginal;
    ObrazekPane krawedzie;
    JInternalFrame ramkaObrazekOryginal;
    JInternalFrame ramkaWykryteKrawedzie;
    JDesktopPane pulpit = new JDesktopPane();
    BufferedImage image;
    BufferedImage operacyjny;
    String sciezka = "";

    public Ramka() {
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    private void jbInit() throws Exception {

        this.getContentPane().add(pulpit);
        setSize(new Dimension(800, 600));
        setTitle("Projekt Specjalizacyjny");
        jMenuPlik.setText("Plik");
        jMenuObrazek.setText("Otwórz obrazek");
        jMenuObrazek.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent actionEvent)
            {
                wybieracz.setApproveButtonText("Otworz");
                int wybor = wybieracz.showOpenDialog(pulpit);
                if(wybor == wybieracz.APPROVE_OPTION)
                {
                    sciezka = wybieracz.getSelectedFile().getPath();
                    try
                    {
                        image = ImageIO.read(wybieracz.getSelectedFile());
                        oryginal = new ObrazekPane(image);
                        oryginal.setToolTipText("Oryginał");
                        ramkaObrazekOryginal = new JInternalFrame(sciezka,true,true,true,true);
                        ramkaObrazekOryginal.setSize(new Dimension(image.getWidth()+10,image.getHeight()+10));
                        ramkaObrazekOryginal.setLocation(0,0);
                        ramkaObrazekOryginal.getContentPane().add(new JScrollPane(oryginal), new BorderLayout().CENTER);
                        pulpit.add(ramkaObrazekOryginal);
                        ramkaObrazekOryginal.setVisible(true);
                    }
                    catch(Exception ex)
                    {
                        JOptionPane.showMessageDialog(pulpit,"Rysunek jest nieprawidlowy","Ostrzezenie",JOptionPane.WARNING_MESSAGE);
                    }
                }
                else
                {
                    JOptionPane.showMessageDialog(pulpit,"Nie wybrales zadnego rysunku","Ostrzezenie",JOptionPane.WARNING_MESSAGE);
                }
            }
        });
        wykrywanieKrawedzi8.setText("Wykryj krawędzie");
        wykrywanieKrawedzi8.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event)
            {
                float[] elements =
                        {
                        -1.0f, -1.0f, -1.0f,
                        -1.0f,  8.f, -1.0f,
                        -1.0f, -1.0f, -1.0f
                };
                ObrazekPane pane = (ObrazekPane) pulpit.getSelectedFrame().getContentPane();
                operacyjny = pane.getImage();
                krawedzie = new ObrazekPane(operacyjny);
                krawedzie.convolve(elements);
                operacyjny = krawedzie.getImage();
                krawedzie.setToolTipText("Wykryta krawędź");
                ramkaWykryteKrawedzie = new JInternalFrame(sciezka,true,true,true,true);
                ramkaWykryteKrawedzie.setSize(new Dimension(image.getWidth()+10,image.getHeight()+10));
                ramkaWykryteKrawedzie.setLocation(0,0);
                ramkaWykryteKrawedzie.getContentPane().add(new JScrollPane(oryginal), new BorderLayout().CENTER);
                pulpit.add(ramkaWykryteKrawedzie);
                ramkaObrazekOryginal.setVisible(true);
            }
        });

        jMenuPlikWyjscie.setText("Wyjście");
        jMenuPlikWyjscie.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent actionEvent)
            {
                   System.exit(0);
               }
           });
           jMenuBar1.add(jMenuPlik);
           jMenuPlik.add(jMenuObrazek);
           jMenuPlik.add(wykrywanieKrawedzi8);
           jMenuPlik.add(jMenuPlikWyjscie);
           setJMenuBar(jMenuBar1);
       }
   }

a tu jest ta klasa mojego panela. W tej klasie sa jakies bzdury do binaryzacji obrazu i odcienie szarosci na to nie musisz zwracac uwagi

package projektspec;

import java.awt.*;
import java.awt.image.*;
import javax.swing.JPanel;

class ObrazekPane extends JPanel
{
    public ObrazekPane(BufferedImage img)
    {
        obr = img;
        if(obr.getWidth() < 640)
        {
            szer = obr.getWidth();
        }
        else
        {
            szer = 640;
        }
        if(obr.getHeight() < 480)
        {
            wys = obr.getHeight();
        }
        else
        {
            wys = 480;
        }
        setPreferredSize(new Dimension(szer, wys));
    }
    
//tu jest ta metoda getImage()
    
    public BufferedImage getImage()
    {
        return obr;
    }
    public void setImage(BufferedImage i)
    {
        obr = i;
        repaint();
    }
    public void paintComponent(Graphics g)
    {
        g.drawImage(obr,0,0,szer,wys,this);
    }
    public BufferedImage odcienieSzarosci(BufferedImage src)
    {
        WritableRaster raster = src.getRaster();
        int[] pikselTab = new int[3*src.getWidth()*src.getHeight()];
        int war1 = 0;
        int war2 = 0;
        int war3 = 0;
        raster.getPixels(0,0,src.getWidth(),src.getHeight(),pikselTab);
        for(int i =0;i<pikselTab.length;i=i+3)
        {
           war1= pikselTab[i];
           if(i+1<pikselTab.length)
           {
               war2 = pikselTab[i + 1];
           }
           if(i+2<pikselTab.length)
           {
               war3= pikselTab[i+2];
           }
           if(i==0)
           {
               pikselTab[i] = (war1+war2+war3)/3;
           }
           else
           {
               pikselTab[i] = (war1+war2+war3)/3;
               if(i+1<pikselTab.length)
               {
                   pikselTab[i+1] = (war1+war2+war3)/3;
               }
               if(i+2<pikselTab.length)
               {
                   pikselTab[i+2] = (war1+war2+war3)/3;
               }
           }
       }
       raster.setPixels(0,0,src.getWidth(),src.getHeight(),pikselTab);
       return src;
   }
   public BufferedImage binaryzuj(BufferedImage img,int prog)
   {
        WritableRaster raster = img.getRaster();
        int[] pikselTab = new int[3*img.getWidth()*img.getHeight()];
        int war1 = 0;
        raster.getPixels(0,0,img.getWidth(),img.getHeight(),pikselTab);
        for(int i =0;i<pikselTab.length;i++)
        {
            war1= pikselTab[i];
            if(war1 < prog)
            {
                pikselTab[i] = 0;
            }
            if(war1 > prog)
            {
                pikselTab[i] = 255;
            }
        }
        raster.setPixels(0,0,img.getWidth(),img.getHeight(),pikselTab);
        return img;
    }

    public BufferedImage filter(BufferedImageOp op)
    {
        BufferedImage filteredImage
                = new BufferedImage(obr.getWidth(), obr.getHeight(), obr.getType());
        op.filter(obr, filteredImage);
        obr = filteredImage;
        repaint();
        return filteredImage;
    }
    public void convolve(float[] elements)
    {
        Kernel kernel = new Kernel(3, 3, elements);
        ConvolveOp op = new ConvolveOp(kernel);
        filter(op);
    }
    private BufferedImage obr;
    public String sciezka;
    private int wys;
    private int szer;
}

Z gory dzieki

0

Ok wyjaśniło się. Próbujesz rzutować JDesktopPane na rozszerzony JPanel. To jest niedozwolone bo wymaga ukrytego rzutowania "w górę". Zresztą porównaj drzewa dziedziczenia:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JDesktopPane.html
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JPanel.html

pomimo że są to obiekty JComponent to nie możesz zrobić takiej sztuki by najpierw rzutować JDesktopPane o dwa poziomy wyzej a następnie taki JComponent dwa niżej. Nie mam jeszcze pomysłu jak by to ominąć w tym konkretnym przypadku, ale ogólnie zamieniłbym któryś z komponentów na konstrukcję MA (klasa zawiera pole danego typu i metody dostępowe), a nie JEST (klasa rozszerza daną klasę).

0

Dzieki serdeczne!!! Od niedawna programuje dlatego czesto zdazaja mi sie glupie bledy. W kazdym razie jeszcze raz bardzo dziekuje za pomoc.

0

No zapomnialem dodac jak rozwiazalem problem:). Zostawilem to klase ObrazekPane tak jak byla ale dodalem nowa klase ktora dziedziczy po JInternallFrame


import javax.swing.*;
public class RamkaWew extends JInternalFrame {
    
    ObrazekPane obrazekPane;
    public RamkaWew(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable, ObrazekPane pane) 
    {
        super(title, resizable, closable, maximizable, iconifiable);
        obrazekPane = pane;
        this.getContentPane().add(pane);
    }
    public void setPane(ObrazekPane pane)
    {
        obrazekPane = pane;
    }
    public ObrazekPane getPane()
    {
        return obrazekPane;
    }
}

wydaje mi sie ze chodzilo Ci troszeczke o cos innego, ale to spelnia w tej chwili moje oczekiwiania. W kazdym razie bez Twojej sugestii to by mi do lba nieprzyszlo o co biega.

1 użytkowników online, w tym zalogowanych: 0, gości: 1