Archief - Simpel? Java File I/O probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Trol

Legacy Member
Hallo allemaal.

Volg al lange tijd avondschool en deze module is terug de beurt aan Java.
De laatste keer dat ik daar nog mee bezig geweest ben was 3jr geleden (ondertussen C#). Ik weet nu dat het sterk gelijkt, doch ik heb een probleem met lezen van bestanden uit een map.

Bedoeling is simpel: Een directory (ff snel aangemaakt C:/foto) met wat gifjes in.
En dan die een beetje als slide show weergeven. Wil niet met vaste aantallen werken dus als ik gifjes in map plaatst moet het prog. dit herkennen.

Heb het wat herwerkt van een code welke ik gekregen heb in de les. Daar kon je wereldbol laten draaien, links, rechts, sneller en trager.

Dit is wat ik nu heb. Hij leest dus wel degelijk alles in maar hij geeft niets weer.
Iemand een idee?

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.File;
import java.util.ArrayList;


public class Main extends JFrame {
  public static void main( String args[] ) {
    JFrame frame = new Main();
    frame.setSize( 800, 680 );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.setTitle( "JPhoto" );
    frame.setContentPane( new Photopaneel() );
    frame.setVisible( true );
  }
}

class Photopaneel extends JPanel
{
      private javax.swing.Timer timer;
      private ArrayList<ImageIcon> fotolijst;
      private int index, volgende;
      private JButton startknop, stopknop;
      private JLabel lblNummer;
      private int delay;
      
  public Photopaneel()
  {
      try
      {
          String imagePath = "C:\\foto\\";
          File directory = new File(imagePath);
          File files[] = directory.listFiles();
          
          fotolijst = new ArrayList<ImageIcon>();

          for (File f : files) 
          {
              String imageName = f.getName();
              ImageIcon plaatje = new ImageIcon(imageName);
              fotolijst.add( plaatje );  
          }
      }
      catch (Exception e)
      {
            JOptionPane.showMessageDialog(null, "fout");
      }
      
      index = 0;
      volgende = 1;
      delay = 2100;

      timer = new javax.swing.Timer( delay, new TimerHandler() );
    
      startknop = new JButton( "start" );
      stopknop = new JButton("stop");
      lblNummer = new JLabel();
      startknop.addActionListener( new StartHandler() );
      stopknop.addActionListener(new StopHandler());
      add( startknop );
      add( stopknop );
      add (lblNummer);
      
  }

  @Override
  public void paintComponent( Graphics g )
  {
    super.paintComponent( g );
    setBackground( Color.WHITE);
    ImageIcon plaatje = fotolijst.get( index );
    lblNummer.setText("" + index);
    plaatje.paintIcon( this, g, 10, 10 ); 
 
  }
  
  class StartHandler implements ActionListener
  {
    public void actionPerformed( ActionEvent e )
    {
      timer.start();
    }
  }
  
  class StopHandler implements ActionListener
  {
    public void actionPerformed( ActionEvent e )
    {
      timer.stop();
    }
  }  

  class TimerHandler implements ActionListener
  {
    public void actionPerformed( ActionEvent e )
    {
      index = index + volgende;
      if( index >= fotolijst.size() )
        index = 0;
      repaint();
    }
  }
}

Alvast bedankt!!

Parnakra

Legacy Member
Op het eerste zicht (zonder te testen, dus) lijkt het alsof je een ImageIcon moet add()-en aan je JPanel en die dan telkens aanpassen aan een bepaalde ImageIcon uit je lijst.

NeverwinterX

Legacy Member
Vervang
Code:
 ImageIcon plaatje = new ImageIcon(imageName);
door
Code:
 ImageIcon plaatje = new ImageIcon(f.getPath());
of
Code:
 ImageIcon plaatje = new ImageIcon(f.toURI().toURL());
Die laatste is vermoedelijk iets veiliger.
De getName() geeft de gewone naam van de file terug. Maar ImageIcon moet natuurlijk het volledige pad weten om de file te kunnen laden.

Trol

Legacy Member
NeverwinterX zei:
Vervang
Code:
 ImageIcon plaatje = new ImageIcon(imageName);
door
Code:
 ImageIcon plaatje = new ImageIcon(f.getPath());
of
Code:
 ImageIcon plaatje = new ImageIcon(f.toURI().toURL());
Die laatste is vermoedelijk iets veiliger.
De getName() geeft de gewone naam van de file terug. Maar ImageIcon moet natuurlijk het volledige pad weten om de file te kunnen laden.

Geweldig! :bow:

Dat was inderdaad de fout. Nu werk het wel gewoon. Doordat ik enkel de naam ophaalde uit de C:/foto liet hij ook enkel die foto's zien die zowel in die map staan als diegene die in de hoofdmap van het project staan.

Bedankt... indien dit verder niet nuttig meer is dit topic mag het voor mijn part gesloten worden.

:applause:
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan