przeglądarka zdjęć

1

Witam!
Jestem początkujący. W ramach ćwiczeń chciałbym stworzyć przeglądarkę zdjęć w javie ale nie jako aplet. Po wybraniu jakiegoś zdjęcia z katalogu powinna być możliwość nawigacji klawiszami poprzednie, nastepne dla wszystkich pozostałych zdjęć w katalogu. Nie wiem jakich klas i rozwiązań użyć aby to zrealizować. Teraz mam możliwość wczytywania pojedyńczych zdjęć. Denerwuje mnie używanie tej metody:

public void paintComponent(Graphics g)
	   	{
		
		Image  obrazek1 = new ImageIcon(sciezka.getImage();   
	   	g.drawImage(obrazek1, 0, 0, this);
	   
	   	}

Czy nie ma innego sposobu? tutaj za każdym razem kiedy chcę wyświetlić na panelu nowy obrazek trzeba tworzyć nowy obiekt aby przesłonić metodę paintComponent(). Czy to dobre zozwiązanie? Poza tym stary obrazek jest pod spodem i nowe nakładają się na niego.
Tutaj cały kod:

import java.awt.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.JFileChooser;
public class TestGUI
{
	public static void main(String[] args) 
	{
		
	TestGUI fotoAlbum = new TestGUI();
	
	fotoAlbum.konfigurujGui();
	
	}
	
	public void konfigurujGui()
	{
		JFrame Ramka = new JFrame("Test GUI");
		
		Ramka.setSize(300, 200);
		Ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Ramka.getContentPane().setLayout(new BorderLayout()); 	
	//panel z przyciskami sterujacymi
		JPanel panelPrzyciskow = new JPanel();
		
		JButton btnPrew = new JButton("prewious");
		btnPrew.addActionListener(new prewListener());
		
		JButton btnOpen = new JButton("Wybierz plik");
		btnOpen.addActionListener(new openListener(Ramka));
		
		JButton btnNext = new JButton("Next");
		btnNext.addActionListener(new nextListener());
		
				
		panelPrzyciskow.add(btnPrew);
		panelPrzyciskow.add(btnOpen);
		panelPrzyciskow.add(btnNext);
		
		Ramka.add(panelPrzyciskow, BorderLayout.SOUTH); //dodaj p.przyciskow na poludnie ramki
		Ramka.setVisible(true);  
	}
	
	
}
class Obraz_Panel extends JPanel {
	 String sciezka=new String("c:/img/tlo.jpg");
    public String getSciezka() {
		return sciezka;
	} 

	public void setSciezka(String sciezka) {
		this.sciezka = sciezka;
	}

	private BufferedImage image;
 
    public Obraz_Panel(String sciezka) {
        super();
        this.sciezka=sciezka;
        File imageFile = new File(sciezka);
        try {
            image = ImageIO.read(imageFile);
        } catch (IOException e) {
            System.err.println("Blad odczytu obrazka");
            e.printStackTrace();
        }
 
        Dimension dimension = new Dimension(image.getWidth(), image.getHeight());
        setPreferredSize(dimension);
    }
 
 

	@Override
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(image, 0, 0, this);
    }
}



// klasy zdarzen dla komponentow

class openListener implements ActionListener{
	 
	 JFrame ramka;
	 openListener(JFrame ramka){
		
		this.ramka=ramka;
	 }
	 
	public void actionPerformed(ActionEvent zdarzenie)
	{
		JFileChooser chooser = new JFileChooser(); 
		chooser.setCurrentDirectory(new File(".")); 
		        chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){ 
		  public boolean accept(File f){ 
		    String name = f.getName().toLowerCase(); 
		         return name.endsWith(".gif") 
		            || name.endsWith(".jpg") 
		            || name.endsWith(".jpeg") 
		            || f.isDirectory(); 
		      } 
		      public String getDescription(){ 
		        return "Image files"; 
		      } 
		   }); 

		int r = chooser.showOpenDialog(chooser); 
		if(r == JFileChooser.APPROVE_OPTION){
		  String name = chooser.getSelectedFile().getAbsolutePath().replace('\\','/'); 
		  System.out.println(name);
		  Obraz_Panel panelNaZdjecia = new Obraz_Panel(name);
			ramka.add(panelNaZdjecia,BorderLayout.CENTER); //dodaj panel wyswietlajacy zdjecia
			ramka.setVisible(true);

		 
			
		  
		}
		
	}
}
class nextListener implements ActionListener{
	public void actionPerformed(ActionEvent zdarzenie){
		
	
	
	}
}

class prewListener implements ActionListener{
	public void actionPerformed(ActionEvent zdarzenie){
		
	}
}

	
	
	
	
	


0

Nie przesłaniaj painta componentu po prostu.

Graphics g = naszKomponent.getGraphics();
i na "g" możesz w ten sposób malować co chcesz, gdzie i kiedy chcesz.
Jak nie chcesz by obrazki się na siebie nakładały i było widać ten pod spodem po prostu przed malowaniem kolejnego zamaluj całość jakimś kolorem.

0

Dziekuje bardzo za szybką odpowiedz ale pogubiłem się już co gdzie mam wywołać.. poniższy kod działa do momentu wybrania pliku a potem "null pointer exception" i masa błędów... Co robię nie tak?

import java.awt.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.*;
import javax.swing.JFileChooser;
public class TestGUI
{
	public static void main(String[] args) 
	{
	TestGUI fotoAlbum = new TestGUI();
	fotoAlbum.konfigurujGui();
	}	
	public void konfigurujGui()
	{
		JFrame Ramka = new JFrame("Test GUI");
		
		Ramka.setSize(300, 200);
		Ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Ramka.getContentPane().setLayout(new BorderLayout()); 	
	//panel z przyciskami sterujacymi
		JPanel panelPrzyciskow = new JPanel();

		JButton btnPrew = new JButton("prewious");
		btnPrew.addActionListener(new prewListener());
		
		JButton btnOpen = new JButton("Wybierz plik");
		btnOpen.addActionListener(new openListener());
		
		JButton btnNext = new JButton("Next");
		btnNext.addActionListener(new nextListener());
		
				
		panelPrzyciskow.add(btnPrew);
		panelPrzyciskow.add(btnOpen);
		panelPrzyciskow.add(btnNext);
		
		Ramka.add(panelPrzyciskow, BorderLayout.SOUTH); //dodaj p.przyciskow na poludnie ramki
		
		Ramka.setVisible(true);  
	}
}
// klasy zdarzen dla komponentow

class openListener implements ActionListener{
	 
	public void actionPerformed(ActionEvent zdarzenie)
	{
		JFileChooser chooser = new JFileChooser(); 
		chooser.setCurrentDirectory(new File(".")); 
		        chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){ 
		  public boolean accept(File f){ 
		    String name = f.getName().toLowerCase(); 
		         return name.endsWith(".gif") 
		            || name.endsWith(".jpg") 
		            || name.endsWith(".jpeg") 
		            || f.isDirectory(); 
		      } 
		      public String getDescription(){ 
		        return "Image files"; 
		      } 
		   }); 

		int r = chooser.showOpenDialog(chooser); 
		if(r == JFileChooser.APPROVE_OPTION){
		  String name = chooser.getSelectedFile().getAbsolutePath().replace('\\','/'); 
		  System.out.println(name);
		  BufferedImage image;
		  image=null;
		  
		  File imageFile = new File(name);
	        try {
	            image = ImageIO.read(imageFile);
	        } catch (IOException e) {
	            System.err.println("Blad odczytu obrazka");
	            e.printStackTrace();
	        }
	        
		  JPanel panelNaZdjecia = new JPanel();
	      Graphics g = panelNaZdjecia.getGraphics();
	      g.drawImage(image,0,0, panelNaZdjecia);
		  //ramka.add(panelNaZdjecia,BorderLayout.CENTER); //dodaj panel wyswietlajacy zdjecia
		  //ramka.setVisible(true);
		}
		
	}
}
class nextListener implements ActionListener{
	public void actionPerformed(ActionEvent zdarzenie){
		
	
	
	}
}

class prewListener implements ActionListener{
	public void actionPerformed(ActionEvent zdarzenie){
		
	}
}
0

Podawaj zawsze gdzie wystąpił ten nullpointerEX

0

C:/Documents and Settings/All Users/Dokumenty/Moje obrazy/Przykładowe obrazy/Zachód słońca.jpg
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at openListener.actionPerformed(TestGUI.java:86)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

0

linia 86:

Graphics g = panelNaZdjecia.getGraphics();
0

Sprawa jest prosta. panelNaZdjecia nie jest nigdzie dodany do żadnego widocznego komponentu.

To zadziała bo po prostu teraz komponent na którym jest to rysowane jest dodany do okna.

import java.awt.*;
 
import javax.imageio.ImageIO;
import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.*;
import javax.swing.JFileChooser;
public class TestGUI
{
	JFrame Ramka = new JFrame("Test GUI");
	public static JLabel l = new JLabel();
        public static void main(String[] args) 
        {
        TestGUI fotoAlbum = new TestGUI();
        fotoAlbum.konfigurujGui();
        }        
        public void konfigurujGui()
        {
                
 
                Ramka.setSize(300, 200);
                Ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Ramka.getContentPane().setLayout(new BorderLayout());         
        //panel z przyciskami sterujacymi
                JPanel panelPrzyciskow = new JPanel();
 
                JButton btnPrew = new JButton("prewious");
                btnPrew.addActionListener(new prewListener());
 
                JButton btnOpen = new JButton("Wybierz plik");
                btnOpen.addActionListener(new openListener());
 
                JButton btnNext = new JButton("Next");
                btnNext.addActionListener(new nextListener());
                
 
                panelPrzyciskow.add(btnPrew);
                panelPrzyciskow.add(btnOpen);
                panelPrzyciskow.add(btnNext);
                Ramka.add(l);
                Ramka.add(panelPrzyciskow, BorderLayout.SOUTH); //dodaj p.przyciskow na poludnie ramki
 
                Ramka.setVisible(true);  
        }
}
// klasy zdarzen dla komponentow
 
class openListener implements ActionListener{
 
        public void actionPerformed(ActionEvent zdarzenie)
        {
                JFileChooser chooser = new JFileChooser(); 
                chooser.setCurrentDirectory(new File(".")); 
                        chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){ 
                  public boolean accept(File f){ 
                    String name = f.getName().toLowerCase(); 
                         return name.endsWith(".gif") 
                            || name.endsWith(".jpg") 
                            || name.endsWith(".jpeg") 
                            || f.isDirectory(); 
                      } 
                      public String getDescription(){ 
                        return "Image files"; 
                      } 
                   }); 
 
                int r = chooser.showOpenDialog(chooser); 
                if(r == JFileChooser.APPROVE_OPTION){
                  String name = chooser.getSelectedFile().getAbsolutePath().replace('\\','/'); 
                  System.out.println(name);
                
 
                
                //                    image = ImageIO.read(imageFile);
				ImageIcon imageI = new ImageIcon(name);
				TestGUI.l.setIcon(imageI);
				
                  
              Graphics g = TestGUI.l.getGraphics();
              g.drawImage(imageI.getImage(),0,0, null);
//              g.drawRect(30, 0, 200, 100);
              
//                  ramka.add(panelNaZdjecia,BorderLayout.CENTER); //dodaj panel wyswietlajacy zdjecia
//                  ramka.setVisible(true);
                }
 
        }
}
class nextListener implements ActionListener{
        public void actionPerformed(ActionEvent zdarzenie){
 
 
 
        }
}
 
class prewListener implements ActionListener{
        public void actionPerformed(ActionEvent zdarzenie){
 
        }
} 
0

Bardzo dziękuje za rozwiązanie problemu! Teraz spróbuję ładować pozostałe obrazki po naciśnięciu przycisków poprzedni/następny ale z moim poziomem wiedzy nie będzie to łatwe:) Czy powinienem użyć klasy BufferedImage?

0

Nie potrzebujesz tego złego tworu ;D

0

ok;) spróbuję użyć klasy File i metody list(), może w taki sposób.. Napiszę o postępach, pozdrawiam!

0

Skopiowałem Ci kod działający, więc rozszyfrowanie nie powinno być go trudne. Aby wczytywać kolejne obrazki przyciskiem dalej, musisz pobrać nazwy wszystkich plików w katalogu, odfiltrować je po rozszerzeniu i następnie je wyświetlać po kolei.

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