Compiler-Fehler Fertiges Programm mit Fehler

Tausendsassa

Aktives Mitglied
Hallo Leute!

Ich habe ein fertiges Programm welches einen Fehler beinhaltet welcher bewirkt, dass das Programm nicht funktioniert. Ich hoffe hier kann mir schnell jemand helfen!!

Java:
package Galerie;

import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.SwingWorker;


public class BilderAlbumGUI extends javax.swing.JFrame
{
    private static final long serialVersionUID = 3924944672470552800L;
    private String[] supportetTypes = new String[]{"png","gif","jpg","jpeg"};
    private File file;
    private List<BufferedImage>list = new ArrayList<BufferedImage>();
    private int index=0;
    
    public BilderAlbumGUI()
    {
        initComponents();
        
        setLocationRelativeTo(null);
        
        bar.setMinimum(0);
    }
    
    private void loadImages()
    {
        new Worker().execute();
    }

    private boolean isSupportet(String name)
    {
        for(String end:supportetTypes)
        {
            if(name.toLowerCase().endsWith(end.toLowerCase()))
            {
                System.out.println("File " + name + " loaded");
                return true;
            }
        }
        System.out.println("File " + name + " is not an Image");
        return false;
    }

    private void openFileChooser()
    {
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int result = chooser.showOpenDialog(this);
        
        if(result == JFileChooser.APPROVE_OPTION)
        {
            file = chooser.getSelectedFile();
            System.out.println(file.toString());
            loadImages();
        }
    }

    class ImageLabel extends JLabel
    {
        private static final long serialVersionUID = -2292257639281450634L;
        private BufferedImage img;
        @Override
        protected void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            if(img != null)
            {
                Graphics2D g2d = (Graphics2D) g;
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                g2d.setColor(Color.WHITE);
                g2d.fillRect(0, 0, getWidth(), getHeight());
                g2d.drawImage(img, 0, 0, this.getWidth(), this.getHeight(),this);		
            }
        }
        
        public BufferedImage getImg()
        {
            return img;
        }
        
        public void setImg(BufferedImage img)
        {
            this.img = img;
            repaint();
        }
    }

    class Worker extends SwingWorker<Integer, String>
    {
        protected Integer doInBackground() throws Exception
        {
            bar.setVisible(true);
            bar.setMaximum(file.listFiles().length);
            bar.setValue(0);
            index = 0;
            list.clear();
            lblImages.setImg(null);
            for(File f:file.listFiles())
            {	
                if(isSupportet(f.getName()))
                {
                    try
                    {
                        list.add(ImageIO.read(f));
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
                bar.setValue(bar.getValue() + 1);
            }
            return 1;
        }
        
        protected void done()
        {
            bar.setVisible(false);
            if(list.size() > 0)
            {
                lblImages.setImg(list.get(0));
//                lblImages.setImg(list.get(index));
            }
        }
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        ImagePanel = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        lblImages = new javax.swing.JLabel();
        bar = new javax.swing.JProgressBar();

        javax.swing.GroupLayout ImagePanelLayout = new javax.swing.GroupLayout(ImagePanel);
        ImagePanel.setLayout(ImagePanelLayout);
        ImagePanelLayout.setHorizontalGroup(
            ImagePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        ImagePanelLayout.setVerticalGroup(
            ImagePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("<");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                onbtPrev(evt);
            }
        });

        jButton3.setText(">");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                onbtNext(evt);
            }
        });

        jButton2.setText("Ordner auswählen");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                onbtChoose(evt);
            }
        });

        lblImages.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblImages.setText("Kein Bild geladen");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(lblImages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                .addContainerGap())
            .addComponent(bar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(90, 90, 90)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblImages, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(bar, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void onbtPrev(java.awt.event.ActionEvent evt) {                          
        if(list!=null&&list.size()!=0)
        {
            index = index > 0 ? index - 1 : list.size() - 1;
            lblImages.setImg(list.get(index));
        }
    }                         

    private void onbtNext(java.awt.event.ActionEvent evt) {                          
        if(list!=null&&list.size()!=0)
        {
            index = list.size() > index + 1 ? index + 1 : 0;
            lblImages.setImg(list.get(index));
        }
    }                         

    private void onbtChoose(java.awt.event.ActionEvent evt) {                            
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int result = chooser.showOpenDialog(this);
        
        if(result == JFileChooser.APPROVE_OPTION)
        {
            file = chooser.getSelectedFile();
            System.out.println(file.toString());
            loadImages();
        }
    }                           
    public static void main(String args[])
    {
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see [url=http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html]How to Set the Look and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)[/url] 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(BilderAlbumGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(BilderAlbumGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(BilderAlbumGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(BilderAlbumGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    loadStyle();
                    BilderAlbumGUI frame = new BilderAlbumGUI();
                    frame.setVisible(true);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
    
    private static void loadStyle()
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (ClassNotFoundException | InstantiationException| IllegalAccessException | UnsupportedLookAndFeelException e)
        {
            e.printStackTrace();
        }
    }
    // Variables declaration - do not modify                     
    private javax.swing.JPanel ImagePanel;
    private javax.swing.JProgressBar bar;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel lblImages;
    // End of variables declaration                   
}

Jeder Aufruf von .setImg() wird als falsch markiert und ich habe Null Ahnung warum...

Ps: Es kann durch aus sein dass ich einfach zu dumm bin den Fehler zu sehen als entschuldigt mcih in diesem Fall 😳

Grüße Tausendsassa
 
Weil "lblImages" diese Methode nicht anbietet, da es sich hier um ein JLabel handelt!?

Ich habe ein fertiges Programm welches einen Fehler beinhaltet welcher bewirkt, dass das Programm nicht funktioniert.

Wenn es Fehler hat dann kann es nicht fertig sein 😀

Jeder Aufruf von .setImg() wird als falsch markiert und ich habe Null Ahnung warum...

Anstatt den ganzen Code zu posten wäre es besser gewesen nur die benötigten zu posten (beim Zusammensuchen dieser Zeilen, wäre einem der Fehler wahrscheinlich auch aufgefallen).
Sprich: Zeilen wo diese Methode aufgerufen wird, Deklaration der Variablen bei denen diese Methode aufgerufen werden soll usw.
 
Zuletzt bearbeitet:
Wie meinst du das, dass lblImage .setImg nicht anbietet?
Oder was müsste ich denn anders machen vlt hilft mir das weiter.

Anstatt den ganzen Code zu posten wäre es besser gewesen nur die benötigten zu posten
Ich habe alles gepostet weil der Fehler ja überall sein könnte ^^
 
Wie meinst du das, dass lblImage .setImg nicht anbietet?

"lblImage" ist ein Objekt der Klasse JLabel, die Klasse JLabel hat laut Dokumentation keine Methode mit den Namen "setImg".

Oder was müsste ich denn anders machen vlt hilft mir das weiter.

Dir welcher Typ der richtige ist.

Ich habe alles gepostet weil der Fehler ja überall sein könnte ^^

Nein, und das "vorfiltern" gehört schon zur Eigeninitiative die man hier an den Tag legen sollte. 😉
(Sollte eine IDE verwendet werden, wird sogar eine entsprechende Compiler Fehlermeldung ausgegeben welche den Fehler genau beschreibt)
 
Zuletzt bearbeitet:
Ja ich habe die Methode .setImg ja programmiert...
Java:
public void setImg(BufferedImage img)
        {
            this.img = img;
            repaint();
        }
 
Labels unterstützen übrigens ImageIcon, du brauchst also keine eigene Label-Klasse

Java:
File file = new File("demo.jpg");
Image img = image = ImageIO.read(file);
ImageIcon icon = new ImageIcon(image);
JLabel lb = new JLabel(icon);

PS: die Namensgebung für deine Variablen ist furchtbar, einer meiner Azubi's wär dafür ausm Fenster geflogen ;-)
 
Zuletzt bearbeitet:
okey, ich versuchs mal so einfach wie es mir einfällt....

Stell dir vor, ein JLabel ist eine Pflanze, und dein ImageLabel ist ein Kaktus.

Dein ImageLabel (Kaktus) erbt von JLabel (Pflanze ) (Dein kaktus ist also im prinzip eine Pflanze)

Wenn du jetzt deine variable wie folgt initialisierst:

Pflanze lblImages = new Kaktus()

dann geht das supi, weil der Kaktus ja auch eine Pflanze ist, wenn ich also mit lblImages arbeite und davon ausgehe, das es eine "Pflanze" ist obwohl es eigentlich ein Kaktus ist ist das kein Problem.

Beispiel: Hey Pflanze, wie groß bist du? (Kaktus antwortet: ) 30cm

Das ist alles soweit ok, problem wirds aber, wenn wir das spiel umdrehen:

Hey Pflanze, wie lang sind deine Stackeln? (Apfelbaum extends Pflanze antwortet: hää?)


Dein Problem ist folgendes: Die Methode getImg() ist teil von ImageLabel (deinem kaktus), deine variable lblImages ist aber vom typ JLabel (Pflanze)

Der Programmcode kann also nicht wissen, das die Pflanze eigentlich ein Kaktus ist und deswegen seine Methoden (getStackel()) nicht aufrufen, weil Pflanzen normalerweise keine Stackeln haben sondern nur der Kaktus, dein Programm weis aber nicht das lblImages nen Kaktus ist.


Du kannst folgendes tun:
A) Ändere den Typ deiner Pflanze lblImages zu ImageLabel (Kaktus)
b) Da es ja eigentlich ein Kaktus ist, kannst du einen CAST machen (schmutzige variante)

Ein Cast bedeutet, das du dem compiler explizit sagst "Hey, ich weiss es besser als du, das ist nen KAKTUS!", problem ist dann nur, wenn es mal wirklich ein Apfelbaum ist, dann crashed dein programm


edit::

hier mal ein paar links dazu:
Polymorphie (Programmierung)
What is Type Casting in Java - Casting one Class to other class or interface Example
 
Zuletzt bearbeitet:

Zurück
Oben