problem z wyswietleniem grafiki urzywajac JFileChooser

0

Z góry chciałbym zaznaczyć że to moje początki wiec sorry za drastyczne błędy :d . Docelowo programik ma służyć do prostej obróbki grafiki (negatyw itp.)ale jak na razie udało mi się stworzyć tylko menu :-(. No i zaczęły się problemy :| Myślę o rozbudowywaniu o jakieś dodatkowe elementy w przyszłości tego stworka wiec dla przejrzystości i czytelności uznałem iż najlepiej będzie każde nowe zdarzenie w menu np otwieranie pliku napisać w nowej klasie. Siedzę już drugi dzień nad tym przejrzałem tutki na necie no i nie znalazłem otwierania obrazka przez JFileChooser w innej klasie. Wiec proszę o jakieś info które pozwoli mi posunąć się trochę do przodu. Zatrzymałem się an tym iż po wywołaniu klasy z JFileChooser nie wiem jak sensownie zwrócić obiekt BufferedImage funkcją czy konstruktorem (nic mi nie wychodzi a wymyślałem już niezłe potworki :). No 2 sprawa jak to wyświetlić [glowa] . HELP HILFE POMOCY


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;

public class test extends JFrame
{
	BufferedImage img; 
	
	public test(BufferedImage i) {
	    JPanel panel = new JPanel(); 
		img = i;  
        System.out.print(img);
	    }
	
	/*public Dimension getPreferredSize() {
        if (img == null) {
             return new Dimension(100,100);
        } else {
           return new Dimension(img.getWidth(null), img.getHeight(null));
          }
     }*/
  public void paint(Graphics g){
		
		g.drawImage(img, 0, 0,null);
		System.out.println("to jest drawImage test "+img);
		}
  
	
	public static void main (String[] args)
{
		try {UIManager.setLookAndFeel(
				UIManager.getSystemLookAndFeelClassName());}
				catch (Exception e)
				{System.out.println("Nie mozna ustawic GUI"); }
	            
				JFrame frame = new JFrame();
				
				frame.setSize(400,400);
				frame.setTitle("Image browser");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
				//obiekt klasy toolkit aby pobrac rozmiar okna i ustawic na srodku 
				Toolkit toolkit = frame.getToolkit(); 
		        Dimension size = toolkit.getScreenSize();
		        frame.setLocation(size.width/2 - frame.getWidth()/2,size.height/2 - frame.getHeight()/2);
		        
		        JPanel panel = new JPanel();
		        frame.getContentPane().add(panel);
		        //If we call setLayout(null) we can position our components absolutely.
		        panel.setLayout(null);
		        //Tooltip do panelu 
		        panel.setToolTipText("Panel");
		        
		        JMenuBar menubar = new JMenuBar();
		        ImageIcon icon = new ImageIcon("exit16.png");//do sprawdzenia
		        
		         JMenu file = new JMenu("File");
		           file.setMnemonic(KeyEvent.VK_F); //skrot klawisowy alt-f
		         JMenu processing = new JMenu("Processing");
		           processing.setMnemonic(KeyEvent.VK_P); 
		           JMenu help = new JMenu("Help");
		           help.setMnemonic(KeyEvent.VK_H); 
		        
		        JMenuItem open = new JMenuItem("Open");
		        open.setMnemonic(KeyEvent.VK_O);
		        open.setToolTipText("Open file");
		        open.addActionListener(new ActionListener() {
		         public void actionPerformed(ActionEvent event) {
		             FileOpen openfile = new FileOpen();
		         
		             //System.out.print(image);
		         }
		         
		     });
		       JMenuItem save = new JMenuItem("Save");
		        save.setMnemonic(KeyEvent.VK_S);
		        save.setToolTipText("Save file");
		        save.addActionListener(new ActionListener() {
		         public void actionPerformed(ActionEvent event) {
		             FileSave savefile = new FileSave();
		             
		         }
		     });
		       JMenuItem fileClose = new JMenuItem("Exit",icon);
		          fileClose.setMnemonic(KeyEvent.VK_X);
		           fileClose.setToolTipText("Exit application");
		           fileClose.addActionListener(new ActionListener() {
		            public void actionPerformed(ActionEvent event) {
		                System.exit(0);
		            }
		        });
		        
		        JMenuItem about = new JMenuItem("About");
		           save.setMnemonic(KeyEvent.VK_A); 
		           about.addActionListener(new ActionListener() {
		               public void actionPerformed(ActionEvent event) {
		                   AboutFrame windowAbout = new AboutFrame();}});
		               
		        frame.setJMenuBar(menubar);
		        
		        file.add(open);
		        file.add(save);
		        file.add(fileClose);
		        
		        help.add(about);
		                
		        menubar.add(file);
		        menubar.add(processing);
		        menubar.add(help);
		        frame.setVisible(true);
			}			
				
}


a to klasa z JFileChooser

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;


public class FileOpen extends JFrame{
	
	public static BufferedImage image = null;
	
 public FileOpen(){
	 JFileChooser fc = new JFileChooser();
	  FileFilter filter = new FileNameExtensionFilter("jpg files", "jpg");
	   fc.addChoosableFileFilter(filter);
     int retvalue = fc.showOpenDialog(FileOpen.this);
     if (retvalue == JFileChooser.APPROVE_OPTION) {
         File file = fc.getSelectedFile();
         try {
			 image = ImageIO.read(file);// i nie wiem co tu dalej 
		     
			 
         } 
         catch (IOException e) {
			System.out.print(e);
			e.printStackTrace();
		    }
     }	
       
 }
	
	
}

Z góry dzięki za wzystkie wskazówki

0

Najpierw nie na temat:

  1. zamiast
                                //obiekt klasy toolkit aby pobrac rozmiar okna i ustawic na srodku
                                Toolkit toolkit = frame.getToolkit();
                        Dimension size = toolkit.getScreenSize();
                        frame.setLocation(size.width/2 - frame.getWidth()/2,size.height/2 - frame.getHeight()/2);

wystarczy

frame.setLocationRelativeTo(null);

po umieszczeniu wszystkich elementów.
2. Tworzenie obiektu JFileChooser oi każdym kliknięciu spowoduje, że user będzie się za każdym razem przebijał z katalogu domyślnego (katalog domowy) do katalogu z obrazkami. User-friendly programy pamietają gdzie ostatnio był otwierany plik.
3. Analogiczna uwaga dotyczy dwóch niezależnych JFileChooserów do otwierania i do zapisywania.
Teraz odpowiedź na pytanie.
Utwórz w głównej klasie pole fileOpen (nie zmienną lokalną) i w metodzie paint rysuj tak

g.drawImage(fileOpen.image, 0, 0,null);
0

Próbowałem zrealizować swój pomysł (nie działało) i zobaczyłem inne ciekawostki. Chcesz zapewne rysować na panelu - musisz zatem nadpisać jego metodę paintComponent. Musisz stworzyć nową klasę dziedziczącą po JPanel i obiekt tej klasy umieścić na framie. Ta klasa powinna zawierać referencję do klasy FileOpen.

0
bogdans_niezalogowany napisał(a)

Próbowałem zrealizować swój pomysł (nie działało) i zobaczyłem inne ciekawostki. Chcesz zapewne rysować na panelu - musisz zatem nadpisać jego metodę paintComponent. Musisz stworzyć nową klasę dziedziczącą po JPanel i obiekt tej klasy umieścić na framie. Ta klasa powinna zawierać referencję do klasy FileOpen.

A gdybym nie rysował na panelu to jak to można byłoby zrobić ?

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