Java "Diashow"

Der Mann mit Wein

Grünschnabel
Hallo ich bin Momentan dabei mir in Java ein Programm zu schreiben welches mir alle Bilder in einem Ordner laden soll, und sie mir dann skaliert anzeigt.

Momentan kann mein programm jedoch nur ein Bild laden und skaliert anzeigen.

Ich habe jetzt etwas gegooglet und mich etwas "gespielt" aber leider keine funktionierende Lösung gefunden. Ich hoffe ihr könnt mir helfen

Code:
import java.awt.*;
import java.awt.event.*;
import java.io.File;

import javax.swing.*;
import javax.swing.filechooser.FileFilter;

public class ImageViewer extends Frame implements ActionListener{
	
private ViewComponent viewComponent = new ViewComponent();

	public ImageViewer(){
		
	super( "Bildbetrachter" );
	
	MenuBar mbar = new MenuBar();
	Menu menu = new Menu( "Datei" );
	MenuItem item = new MenuItem( "Öffnen" );
    MenuItem item1 = new MenuItem( "close" );
	item.addActionListener( this );
	item1.addActionListener( this );
	
	menu.add( item );
	menu.add( item1 );
	
	mbar.add( menu );                
	setMenuBar( mbar );	
	
	add( viewComponent ); 
	
	setSize( 600, 400 );
	
	}
           
	public void actionPerformed( ActionEvent e ){
	String s1 =	e.getActionCommand();	
	
		if(s1 == "Öffnen"){
			JFileChooser d = new JFileChooser();
			d.setFileFilter( new FileFilter(){
					
					public boolean accept(File f)
				{
					return f.isDirectory() || f.getName().toLowerCase().endsWith(".jpg")
					|| f.getName().toLowerCase().endsWith(".gif");
				}
				public String getDescription()
				{
					return "*.jpg;*.gif";
				}
				
				} );
				
			d.showOpenDialog( null );
			File file = d.getSelectedFile();
			viewComponent.setImage( file );
		}
		
		else if(s1 == "close"){
			System.exit(0);
		}
	}

	public static void main( String args[] ){
		
	new ImageViewer().setVisible( true );
	
	}
}

class ViewComponent extends JComponent{
	
	private Image image;

	protected void paintComponent( Graphics g ){
		
		if ( image != null )
		g.drawImage( image, 0, 0,500,500, this );
	}

	public void setImage( File file ){
		
		image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
		if ( image != null )
		repaint();
	}
}
 
Hab mal grob drüber geschaut: Strings vergleicht man in Java nicht mit == sondern mit der equals Methode.

Ansonsten: Was funktioniert denn nicht?
 
Das mit den Strings funktioniert aber (schlechte angewohnheiten aus meiner C++/C Zeit :) ) Mein Problem ist wie gesagt, das ich nun nicht weiß wie ich es realisieren kann, das alle Bilder aus einem bestimmten Ordner geladen werden, und ich zwischen ihnen per Button oder so wechseln kann. Ich habe gegoogelt aber leider nichts hilfreiches gefunden
 
Zu den Stringvergleichen:

Java:
String test = "Hallo";
String test2 = new String("Hallo");
String test3 = "Hallo";

System.out.println((test == test2) + " " + test.equals(test2));
System.out.println((test == test3) + " " + test.equals(test3));

== testet Objektgleichheit. Da in Java selbe Strings aufs selbe Objekt abgebildet werden hat man meist Glück dass das funktioniert. Aber wie zu sehen muß das nicht immer der Fall sein. Also verwende bitte außer bei primitiven equals.

Alle pngs aus einem Verzeichnis findet man so:
Java:
File dir = new File(".");
File [] files = dir.listFiles(new FilenameFilter(){

	@Override
	public boolean accept(File dir, String name) {
		// TODO Auto-generated method stub
		return name.endsWith(".png");
	}
	
});

if(files != null){
	for(File f : files){
		System.out.println(f.getAbsolutePath());
	}
}

Wie man daraus eine Diashow macht solltest du mal selber überlegen.
 
Hallo,

hier mal ein Beispiel für eine kleine Dia-Show mit einem animierten Blend-Übergangseffekt zwischen den Bildern mit dem Java Timing Framework:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.TimingTargetAdapter;
import org.jdesktop.animation.timing.Animator.RepeatBehavior;

import composite.BlendComposite;

/**
 * @author Tom
 * 
 */
public class SlideShowExample extends JFrame {
    Animator animator;
    String baseDirectoryLocation;
    volatile boolean stop;
    int animationDurationInImMilliSeconds = 3000;
    int pauseDurationBetweenAnimationInMilliSeconds = 1000;

    final BufferedImage image;

    public SlideShowExample(String baseDirectoryLocation) {
        super("SlideShowExample");
        GraphicsEnvironment.getLocalGraphicsEnvironment()
                .getDefaultScreenDevice().setFullScreenWindow(this);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    stop = true;
                    setVisible(false);
                    dispose();
                    System.exit(0);
                }
            }
        });
        this.image = new BufferedImage(getWidth(), getHeight(),
                BufferedImage.TYPE_INT_ARGB);
        this.baseDirectoryLocation = baseDirectoryLocation;
        startSlideShowWith(new File(baseDirectoryLocation)
                .listFiles(new FileFilter() {
                    public boolean accept(File pathname) {
                        return pathname.getName().toLowerCase().endsWith("jpg");
                    }
                }));
    }

    private void startSlideShowWith(final File[] imageLocations) {
        final BufferedImage[] cache = new BufferedImage[imageLocations.length];

        final AtomicInteger currentIndex = new AtomicInteger();
        animator = new Animator(animationDurationInImMilliSeconds, Animator.INFINITE, RepeatBehavior.LOOP,
                new TimingTargetAdapter() {
                    int current;
                    int next;

                    @Override
                    public void repeat() {
                        try {
                            TimeUnit.MILLISECONDS.sleep(pauseDurationBetweenAnimationInMilliSeconds);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        currentIndex.set(next);
                    }

                    public void timingEvent(float fraction) {

                        current = currentIndex.get() % imageLocations.length;
                        next = (currentIndex.get() + 1) % imageLocations.length;

                        try {
                            if (cache[current] == null) {
                                cache[current] = ImageIO
                                        .read(imageLocations[current]);
                            }

                            if (cache[next] == null) {
                                cache[next] = ImageIO
                                        .read(imageLocations[next]);
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        Graphics2D g = (Graphics2D) image.getGraphics();

                        g.drawImage(cache[current], 0, 0, getWidth(),
                                getHeight(), null);
                        g.setComposite(BlendComposite.Normal.derive(fraction));
                        g.drawImage(cache[next], 0, 0, getWidth(), getHeight(),
                                null);

                        repaint();

                    }
                });

        animator.start();

    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SlideShowExample("C:/Users/Public/Pictures/Sample Pictures")
                        .setVisible(true);
            }
        });
    }
}
Java Timing Framework Fundamentals:
http://www.infoq.com/resource/artic...ts/en/resources/FilthyRichClients14_InfoQ.pdf
https://timingframework.dev.java.net/

Die Sourcen für das Blendcomposite findet man hier:
http://www.curious-creature.org/2006/09/20/new-blendings-modes-for-java2d/

Gruß Tom
 
Alle pngs aus einem Verzeichnis findet man so:
Java:
File dir = new File(".");
File [] files = dir.listFiles(new FilenameFilter(){

	@Override
	public boolean accept(File dir, String name) {
		// TODO Auto-generated method stub
		return name.endsWith(".png");
	}
	
});

if(files != null){
	for(File f : files){
		System.out.println(f.getAbsolutePath());
	}
}

Kann es sein das in dem Code irgendwo ein Fehler versteckt ist? Ich bringe es beim besten Willen nicht zum laufen.
 
Hallo,

in dem Code ist kein Fehler versteckt.
Was genau funktioniert denn nicht? Wenn du uns nicht sagst, was da nicht funktioniert, kann es keiner wissen.

MFG

Sascha
 
Zurück