Erste Schritte ExceptionError beim Lesen eines .ZIP

  • Themenstarter Themenstarter JavaNoob334455
  • Beginndatum Beginndatum
J

JavaNoob334455

Gast
Hallo!

Wie der Name schon sagt, krieg ich dauernd ne Exception-Meldung von der ich nicht weiß woher sie kommt! Der Programmasuschnitt soll folgendes tun: im [WR]src[/WR]-Ordner meines netbean-Projektes liegt, dort wo auch die java-files sind, ein zip-archiv. In diesem befinden sich direkt sehr sehr viele Bilder (ca. 250). Diese möchte ich auslesen und in ein Panel mit einem GridLayout legen! Leider gibt es scheinbar ein problem mit der Funktion InitComponents() vllt fällt euch auf, was nicht stimmt? ich bin ratlos...

Ich poste hier mal nur den Teil von dem ich glaube dass er wichtig ist, damit es nicht so viel Code ist!



Java:
public void InitComponents() throws IOException{
              
        GridLayout GL = new GridLayout(5,0);   
        JPanel panel = new JPanel();
        panel.setLayout(GL); 
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        
        JScrollPane SP = new JScrollPane(panel);
        SP.setViewportView(panel);
              
        ZipFile zf = new ZipFile(getClass().getResource(Edition + ".zip").getPath());
           
        for (Enumeration<? extends ZipEntry> e = zf.entries(); e.hasMoreElements();) {
            ZipEntry ze = e.nextElement(); 
            if (ze.isDirectory()) {continue;}
            
            BufferedInputStream inputStream = new BufferedInputStream(zf.getInputStream(zf.getEntry(ze.getName())));
            BufferedImage BI = GetOneImageFromZip(inputStream);
            Icon ico = new ImageIcon(ConvertToImage(BI));
            Card OneCard = new Card("Card", null, ico);
            panel.add(OneCard);
            inputStream.close();
        }
              
        add(panel, BorderLayout.CENTER);
    }
    
    public BufferedImage GetOneImageFromZip(BufferedInputStream Stream) throws IOException{       
        return ImageIO.read(Stream);
    }
    
    public static Image ConvertToImage(BufferedImage bufferedImage) {
        return Toolkit.getDefaultToolkit().createImage(bufferedImage.getSource());
    }

LG JavaNoob =D
 
Ah grade gesehen es fehlt noch der QuellCode der Klasse Card!

Ich reiche sie hier nach:

Java:
package mtg;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.Icon;

//-----------------------------------------
// CardClass
//-----------------------------------------
public class Card extends javax.swing.JPanel implements MouseListener {
    private static final long serialVersionUID = 3670910111612350552L;

    //  private Icon cardPicture;
    private String name;
    private Icon rollOver;
    private Icon normalPic;
    private ArrayList<ActionListener> listener = null;

    /**
     * Creates new form Card
     */
    public Card() {
        initListener();
        normalPic = new DefaultIcon();
        rollOver = new DefaultIcon();
        initComponents();
        setPicture();
    }

    public Card(String name, Icon rollOver, Icon normalPic) {
        initListener();
        this.normalPic = normalPic;
        this.rollOver = rollOver;
        this.name = name;
        initComponents();
        cardName.setText(name);
        setPicture();
        this.rollOverButton.setActionCommand(name);
    }

    private void setPicture() {
        rollOverButton.setRolloverEnabled(true);
        rollOverButton.setIcon(normalPic);
        rollOverButton.setRolloverIcon(rollOver);

    }
    private void initListener(){
        listener = new ArrayList<ActionListener>();
	addMouseListener(this);
    }

    public String getCardName() {
        return cardName.getText();
    }

    public Icon getNormalPic() {
        return normalPic;
    }

    public Icon getRollOver() {
        return rollOver;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        cardName = new javax.swing.JLabel();
        rollOverButton = new javax.swing.JButton();

        rollOverButton.setMaximumSize(new java.awt.Dimension(200, 279));
        rollOverButton.setMinimumSize(new java.awt.Dimension(200, 279));
        rollOverButton.setPreferredSize(new java.awt.Dimension(200, 279));
        rollOverButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                none(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(cardName, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addComponent(rollOverButton, 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()
                .addComponent(rollOverButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(cardName, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
    }// </editor-fold>                        

    private void none(java.awt.event.ActionEvent evt) {                      
        // TODO add your handling code here:
    }                     

    // Variables declaration - do not modify                     
    private javax.swing.JLabel cardName;
    private javax.swing.JButton rollOverButton;
    // End of variables declaration                   

    @Override
    public void mouseClicked(MouseEvent evt) {
        fireUpdate(new ActionEvent(this, 0, name));
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    protected void fireUpdate(ActionEvent evt) {
        for (ActionListener al : listener) {
            al.actionPerformed(evt);
        }
    }

    public void addActionListener(ActionListener al) {
        listener.add(al);
        this.rollOverButton.addActionListener(al);
    }

    public void removeActionListener(ActionListener al) {
        listener.remove(al);
    }
}


Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mtg;

import java.awt.Component;
import java.awt.Graphics;
import javax.swing.Icon;

//-----------------------------------------
// DefaultIcon
//-----------------------------------------
public class DefaultIcon implements Icon{

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
    }

    @Override
    public int getIconWidth() {
        return 200;
    }

    @Override
    public int getIconHeight() {
        return 279;
    }
    
}
 
Ich erhalte die Exception-Meldung aus meinem catch-Block, compile läuft ohne probs:

Java:
public static void main(String[] args) {
        
        try{
            MTG myObj = new MTG();
        }
        catch (IOException e){
            System.err.println("Exception found....");
        }           
    }

beim späteren öffnen der klasse die die funktion InitComponents aufruft erhalte ich immer "Exception found..." und die Bilder bzw das Panel werden nicht angezeigt!
Das ist dann in nem neuen Fenster nicht im Hauptframe wo dieses Problem besteht!
 
Dann lass dir die genau Exception mal ausgeben:
Java:
e.printStacktrace();
Dann bekommst du ne detaillierte Fehlermeldung.
 
Also nochmal zur Klärung was ich meine:
Beim Start des Programmes wird das Objekt MTG erstellt, welches von JFrame ableitet, darin sind Buttons klickt man auf so nen button sollen die Bilder des zip-archivs in ein neues Fenster geladen werden (es wird dabei die klasse erstellt, welche InitComponents aufruft). ich erhalte auch das Fenster aber die Karten befinden sich nicht darin und Exception found... scheint auf der ausgabe aus!
 
Ich denke ein Problem könnte die Positonierung der Zip datei sein.
So wie ich das sehe guckt er ja mit
Code:
getClass().getResource(Edition + ".zip").getPath()
im Pfad der Klasse?
Diese ist aber nicht wenn dus ausführst der src Ordner sondern iwo in build/classes also dort wo er hinkompiliert. Also entweder dorthin machen, oder ins Projektverzeichniss welches das Arbeitsverzeichniss standardmäßig ist.

Falls ich iwas falsch sehe tuts mir leid^^
 
Java:
e.printStacktrace();

erhalte hier eine Compilermeldung (cannot find symbol)
 
Joa, das T muss groß geschrieben werden:
Java:
e.printStackTrace()

Aber sowas findet man auch in den Dokus :/
 
Ich denke ein Problem könnte die Positonierung der Zip datei sein.
So wie ich das sehe guckt er ja mit
Code:
getClass().getResource(Edition + ".zip").getPath()
im Pfad der Klasse?
Diese ist aber nicht wenn dus ausführst der src Ordner sondern iwo in build/classes also dort wo er hinkompiliert. Also entweder dorthin machen, oder ins Projektverzeichniss welches das Arbeitsverzeichniss standardmäßig ist.

Falls ich iwas falsch sehe tuts mir leid^^

befindet sich in MTG/src/mtg also da wo auch die java-files sind soweit ich weiß kommt man ja genau dahin mit getClass().getResource() oder täusche ich mich hier?


mtg = name des projektes
 
Wie gesagt
Code:
getClass().getResource(Edition + ".zip").getPath()
sollte ja zur Laufzeit eigentlich den Pfad der .class Datei nehmen zum suchen quasi. Und das ist ja nichtmehr der Ort der .java Datein.

Kannst ja mal die Zip Datei in "build/classes/mtg/" packen. Vllt hilft das ja weiter.

und btw das wird nicht etwa ein Programm zu Magic the Gathering? 😀 wenn ja find ichs gut
 
Hoi, also als erstes mal: ja es geht um magic:The Gathering, will nen DeckBaus-Simulator basteln, sieht auch schon ganz hübsch aus so far...

zum Thema: als ich grade eben deinen Vorschlag testen wollte mit dem verschieben vom zip-archiv musste ich feststllen, dass sich das archiv scheinbar automatisch auch in diesem ordner bildet.....also ich habe meine ARCHIVE quasi SOWOHL im src als auch im Build ordner unter dem Pfad den du oben angegeben hast^^ werde das dann wohl ausm src ordner löschen können denk ich mal...

Löst aber leider mein Problem noch nicht =/
 
java.io.FileNotFoundException: C:\Users\Mat\Desktop\Knowledge\Magic%20-%20Projekt\MTG\build\classes\mtg\Mirrodin_Besieged.zip (Das System kann den angegebenen Pfad nicht finden)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:214)
at java.util.zip.ZipFile.<init>(ZipFile.java:144)
at java.util.zip.ZipFile.<init>(ZipFile.java:115)
at mtg.Edition.InitComponents(Edition.java:43)
at mtg.Edition.<init>(Edition.java:103)
at mtg.MTG$EditionButtonHandler.actionPerformed(MTG.java:319)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
 
tja ... sowas passiert halt wenn man sich auf java-methoden verlässt die eine URL liefern und dann daraus OHNE URLDecoder einen File-objekt erzeugen will .. grund : leer- und andere sonderzeichen die nicht decoded werden ...


natürlich ist this.getClass().getClassLoader().getResource() bzw -AsStream() der "normale" weg ... kann aber wie man hier sieht auch schief gehen ...

eleganter ist diese zeile :

Java:
new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI())

da File auch einen konstruktor hat der eine URI akzeptiert erhält man so ein "funktionsfähiges" File-Objekt auf den CodeSource ... das ist entweder das verzeichnis in dem das CLASS-File liegt oder bei gepackten apps das JAR-File ...
von diesem File-Objekt aus kann man sich nun mit listFiles() weiter zum "gewünschten" objekt "hangeln" und dieses, wenn der konstruktor der zielklasse FILE unterstützt direkt, ansonsten mit getAbsolutePath() den für java verständlichen pfad übergeben ...

natürlich kann man auch auf ClassLoader.getResource() toURI() callen und damit arbeiten ... macht aber gerade bei JAR-apps probleme wenn man auf resourcen AUßERHALB des JAR zugreifen will ...
 
tja ... sowas passiert halt wenn man sich auf java-methoden verlässt die eine URL liefern und dann daraus OHNE URLDecoder einen File-objekt erzeugen will .. grund : leer- und andere sonderzeichen die nicht decoded werden ...


natürlich ist this.getClass().getClassLoader().getResource() bzw -AsStream() der "normale" weg ... kann aber wie man hier sieht auch schief gehen ...

eleganter ist diese zeile :

Java:
new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI())

da File auch einen konstruktor hat der eine URI akzeptiert erhält man so ein "funktionsfähiges" File-Objekt auf den CodeSource ... das ist entweder das verzeichnis in dem das CLASS-File liegt oder bei gepackten apps das JAR-File ...
von diesem File-Objekt aus kann man sich nun mit listFiles() weiter zum "gewünschten" objekt "hangeln" und dieses, wenn der konstruktor der zielklasse FILE unterstützt direkt, ansonsten mit getAbsolutePath() den für java verständlichen pfad übergeben ...

natürlich kann man auch auf ClassLoader.getResource() toURI() callen und damit arbeiten ... macht aber gerade bei JAR-apps probleme wenn man auf resourcen AUßERHALB des JAR zugreifen will ...


Das Zip-Archiv hieß vorher Magic_2013, jetzt hab ichs mal mit "Magic" versucht wo ja wohl keine Sonderzeichen drin sind aber geht dennoch nicht, das kann also hier nicht der Grund sein...

Trotzdem mal danke für die alternative ich probier das mal umschreiben! =)
 
An alle: Problem mit Decoder gelöst.

Hab einfach den Decoder auf String angewendet und den für den Konstruktoraufruf vom ZipFile verwendet...

Danke für eure Hilfe =)
 
Hätte noch eine Frage! Wie kann ich möglichst einfach während jetzt meine Bilder in der Schleife geladen werden einen Ladebalken anzeigen lassen? weil mit den 250 Bilder dauert das immer so ca 6 sekunden und das sieht dann ned so schön aus!
 

Neue Themen


Zurück
Oben