# Image auf ein Canvas abbilden



## PAS (17. Dez 2012)

Hallo liebe Leute, 

ich melde mich hier, weil ich ein Anfänger in Java bin und total im Stress bin. I need your help, please!

Es geht darum, dass ich an einem Bildverarbeitungs Programm arbeite. 

DAS EIGENTLICHE PROBLEM liegt darin, dass ich eine GUI habe auf welche sich buttons, jMenuBar etc und eine CANVAS befinden. 

WAS NICHT FUNKTIONIERT ist: 

Ich kann auf "bild laden" klicken, es öffnet sich ein Fenster für das auswählen eines Bildes - ich wähle ein Bild aus, klicke auf OK aber es wird einfach nichts auf die Canvas geladen...ich habe schon alles ausprobiert, die Canvas bleibt leer :-(...vielleicht kann mir einer schnell helfen und ja, es muss eine CANVAS sein...

Hier der Teil des Quellcodes, um welchen sich alles dreht...


```
...
        );
        board = new Bildboard();
        this.getContentPane().add(board);

      }

      // innere Klasse: MyActionist
      class MyActionist implements ActionListener{
        public void actionPerformed(ActionEvent e){
           laden();
        }
      }

      // innere Klasse: Bildboard
      class Bildboard extends Canvas{
      private static final long serialVersionUID = 1L;
    	Bildboard(){
         this.setPreferredSize(new Dimension(500,500));
        }
        // Methode der Klasse Bildboard
        public void paintComponent(Graphics g){
          super.print(g);
          if(img != null){
            g.drawImage(img,0,0,this);
          }
        }
      }
      

      
      // Methode der äußeren Klasse !!!
      public void laden(){
         // merkt sich den Dateinamen
         String datei;

         JFileChooser myfile = new JFileChooser();
         myfile.showOpenDialog(null);

         // Dateityp String nicht file!!
         if(myfile.getSelectedFile() == null) {
        	 return;
         }
         datei = myfile.getSelectedFile().toString();

          // = new Toolkit();
         Toolkit toolkit = Toolkit.getDefaultToolkit();

         // damit das Bild nicht vor Beendigung
         // des Ladevorganges dargestellt wird
         MediaTracker kontrolle = new MediaTracker(this);
         //img = new Image();
         originalImage = img = toolkit.getImage(datei);
         // id Nummer, damit java weiß, welches Bild gement ist
         kontrolle.addImage(img,0);

         try{
           kontrolle.waitForID(0);
         }
         catch(InterruptedException e){
           System.out.println("Laden fehlgeschlagen!");
         }
         this.board.repaint();
      }
       ...
```


----------



## dayaftereh (17. Dez 2012)

In deiner paintComponet von deine Bildboard rufst du paint() auf! Mach mal folgendes:


```
public void paintComponent(Graphics g){
   super.paintComponent(g);
   if(img != null){
      g.drawImage(img,0,0,this);
   }
}
```


----------



## PAS (17. Dez 2012)

Danke, das habe ich auch schon probiert, jedoch sagt er mir da: " The method paintComponent(Graphics) is undefined for the type canvas" ... :-(


----------



## PAS (17. Dez 2012)

Ich denke ich muss irgendwie auf die  ---> "canvas1 = new java.awt.Canvas();" verweisen, damit auch wirklich auf dieser Canvas das Bild angezeigt wird...nur wie?...


----------



## dayaftereh (17. Dez 2012)

Ach Stimmt, du must die paint Methode überschreiben. Das Canvas ist ja keine Swing Komponente sonder AWT.


```
@Override
public void paint(Graphics g){
   super.paint(g);
   if(img != null){
      g.drawImage(img,0,0,this);
   }
}
```


----------



## PAS (17. Dez 2012)

Danke für die Hilfe, aber es tut sich nichts...:-(...ich verzweifel, vielleicht liegt ja noch irgendwo ein kleiner Fehler...hmmmmmm


----------



## PAS (17. Dez 2012)

Ich schieß nochmal den ganzen Code raus der GUI, ich weiß dass das nicht zumutbar ist, dass sich diesen jemand genauer anguckt, aber vielleicht habe ich ja Glück und es gibt jemanden, ich hoffe es... :-(


```
package projekt2012;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;


import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JFileChooser;

/**
 *
 * @author Roman/Mek/Valerian
 */
public class Fenster extends javax.swing.JFrame{


		private static final long serialVersionUID = 1L;
	// Listener und Bühne benötigen Referenz!
	  Bildboard board;
	  Image originalImage, img;
	  ArrayList<Filter> filter = new ArrayList<Filter>();

	  Fenster(){
		filter.add(new BlurFilter());
		filter.add(new BlurKernelFilter());
		filter.add(new GreyscaleFilter());
		filter.add(new InvertFilter());
		filter.add(new LaplaceFilter());
		filter.add(new RotFilter());
		filter.add(new GrünFilter());
		filter.add(new BlauFilter());
	  

        canvas1 = new java.awt.Canvas();
        label1 = new java.awt.Label();
        label2 = new java.awt.Label();
        button1 = new java.awt.Button();
        button2 = new java.awt.Button();
        button3 = new java.awt.Button();
        button4 = new java.awt.Button();
        button5 = new java.awt.Button();
        button6 = new java.awt.Button();
        button7 = new java.awt.Button();
        button8 = new java.awt.Button();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
    

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        canvas1.setBackground(new java.awt.Color(204, 204, 255));

        
        
        label1.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N
        label1.setText("BILD");

        label2.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N
        label2.setText("FILTER");

        button1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button1.setLabel("button1");
        button2.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button2.setLabel("button2");
        button3.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button3.setLabel("button3");
        button4.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button4.setLabel("button4");
        button5.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button5.setLabel("button5");
        button6.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button6.setLabel("button6");
        button7.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button7.setLabel("button7");
        button8.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        button8.setLabel("button8");


        jMenu1.setBorder(null);
        jMenu1.setText("Datei");

        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, 0));
        jMenuItem1.setText("Bild laden");
        jMenuItem1.addActionListener(new MyActionist());
        jMenu1.add(jMenuItem1);


        jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, 0));
        jMenuItem2.setText("Reset Image");
        jMenuItem2.addActionListener(new ActionListener() {
    		@Override
    		public void actionPerformed(ActionEvent arg0) {
    			if(originalImage == null) {
    				return;
    			}

    			img = originalImage;
    			board.repaint();
    		}
    	});
        jMenu1.add(jMenuItem2);

        jMenuBar1.add(jMenu1);


        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        
        
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(canvas1, javax.swing.GroupLayout.PREFERRED_SIZE, 1024, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 16, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(label2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(button8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(57, 57, 57))
        );
        
        
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(label2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(canvas1, javax.swing.GroupLayout.PREFERRED_SIZE, 768, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(button1, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(button2, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(button3, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(button4, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(button5, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(button6, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(button7, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(button8, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(31, Short.MAX_VALUE))
        );
        board = new Bildboard();
        this.getContentPane().add(board);

      }

      // innere Klasse: MyActionist
      class MyActionist implements ActionListener{
        public void actionPerformed(ActionEvent e){
           laden();
        }
      }
      
      

      // innere Klasse: Bildboard
      class Bildboard extends Canvas{
        /**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	Bildboard(){
         this.setPreferredSize(new Dimension(500,500));
        }
        // Methode der Klasse Bildboard
    	public void paint(Graphics g){
    		   super.paint(g);
    		   if(img != null){
    		      g.drawImage(img,0,0,this);
    		   }
    		}
    	}
    		
         
        
      
      

      
      // Methode der äußeren Klasse !!
      public void laden(){
         // merkt sich den Dateinamen
         String datei;

         JFileChooser myfile = new JFileChooser();
         myfile.showOpenDialog(null);

         // Dateityp String nicht file!!
         if(myfile.getSelectedFile() == null) {
        	 return;
         }
         datei = myfile.getSelectedFile().toString();

          // = new Toolkit();
         Toolkit toolkit = Toolkit.getDefaultToolkit();

         // damit das Bild nicht vor Beendigung
         // des Ladevorganges dargestellt wird
         MediaTracker kontrolle = new MediaTracker(this);
         //img = new Image();
         originalImage = img = toolkit.getImage(datei);
         // id Nummer, damit java weiß, welches Bild gement ist
         kontrolle.addImage(img,0);

         try{
           kontrolle.waitForID(0);
         }
         catch(InterruptedException e){
           System.out.println("Laden fehlgeschlagen!");
         }
         this.board.repaint();
      }
        


    private java.awt.Button button1;
    private java.awt.Button button2;
    private java.awt.Button button3;
    private java.awt.Button button4;
    private java.awt.Button button5;
    private java.awt.Button button6;
    private java.awt.Button button7;
    private java.awt.Button button8;
    private java.awt.Canvas canvas1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private java.awt.Label label1;
    private java.awt.Label label2;

}
```


----------



## dayaftereh (17. Dez 2012)

Ändere mal die Background Color von deinem Canvas auf Rot und guck mal ob es überhaupt angezeigt wird?


----------



## PAS (17. Dez 2012)

Ja, das funktioniert! ...


----------



## dayaftereh (17. Dez 2012)

Also die Paint Method wird aufgerufen?

Dann würde ich mal das Bild wie folgt laden:

```
File file = new File(datei);
img = ImageIO.read(file);
```


----------



## PAS (17. Dez 2012)

Welchen Code, bzw. an welcher Stelle soll ich denn den Code dann zu diesem ersetzen? Sorry, bin echt ein Anfänger...


----------



## dayaftereh (17. Dez 2012)

Löschen!

```
Toolkit toolkit = Toolkit.getDefaultToolkit();
 
         // damit das Bild nicht vor Beendigung
         // des Ladevorganges dargestellt wird
         MediaTracker kontrolle = new MediaTracker(this);
         //img = new Image();
         originalImage = img = toolkit.getImage(datei);
         // id Nummer, damit java weiß, welches Bild gement ist
         kontrolle.addImage(img,0);
 
         try{
           kontrolle.waitForID(0);
         }
         catch(InterruptedException e){
           System.out.println("Laden fehlgeschlagen!");
         }
```

Hinzufügen:


```
File file = new File(datei);
img = ImageIO.read(file);
```


----------



## PAS (17. Dez 2012)

Danke für deine Mühe, aber er erkennt imageIO nicht, dazu öffnet sich nichtmal das Auswahlfenster beim "bild laden" ...;(


----------



## dayaftereh (17. Dez 2012)

Hast du ImageIO importiert?


----------



## PAS (17. Dez 2012)

Hab jetzt:


```
public void laden(){
         // merkt sich den Dateinamen
         String datei;

         JFileChooser myfile = new JFileChooser();
         myfile.showOpenDialog(null);

         // Dateityp String nicht file!!
         if(myfile.getSelectedFile() == null) {
        	 return;
         }
         datei = myfile.getSelectedFile().toString();

         File file = new File(datei);
         try {
			img = ImageIO.read(file);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
         this.board.repaint();
      }
```



Das Fenste beim "Bild Laden" öffnet sich nun auch, kann auch auswählen, aber es wird nichts auf der Canvas ausgegeben...


----------



## dayaftereh (17. Dez 2012)

Schau mal hier, habe ein Kleines Beispiel Programmiert:

```
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ImageDisplay implements Runnable, ActionListener{
	
	private Object lock = null;
	private JFrame frame = null;
	private MyCanvas canvas = null;
	private BufferedImage image = null;

	public ImageDisplay() {
		super();
		this.lock = new Object();
	}
	
	@Override
	public void run() {
		this.frame = new JFrame();
		this.frame.setPreferredSize(new Dimension(800,600));
		this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.frame.setLayout(new BorderLayout());
		
		JButton open = new JButton("Open");
		open.addActionListener(this);
		this.frame.add(open, BorderLayout.NORTH);
		
		this.canvas = new MyCanvas();
		this.frame.add(this.canvas, BorderLayout.CENTER);
		
		this.frame.pack();
		this.frame.setLocationRelativeTo(null);
		this.frame.setVisible(true);
	}
	
	private class MyCanvas extends Canvas {
		
		private static final long serialVersionUID = 1L;

		@Override
		public void paint(Graphics g) {			
			super.paint(g);
			synchronized (lock) {
				if(image != null){
					g.drawImage(image, 0, 0, this);
				}
			}
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		 JFileChooser fc = new JFileChooser();
         fc.showOpenDialog(null);
 
         final File file = fc.getSelectedFile();
         if(file == null) {
             return;
         }		
         
         Thread t = new Thread(){
        	@Override
        	public void run() {        		
        		try {
        			synchronized (lock) {
        				image = ImageIO.read(file);
					}
				} catch (IOException e) {					
					e.printStackTrace();
				}
        		repaintCanvas();
        	} 
         };         
         t.start();         
	}
	
	private void repaintCanvas(){
		if(SwingUtilities.isEventDispatchThread()){
			this.canvas.repaint();
		} else {
			SwingUtilities.invokeLater(new Runnable() {				
				@Override
				public void run() {
					repaintCanvas();					
				}
			});
		}
	}
	
	public static void main(String[] args) {
		ImageDisplay imageDisplay = new ImageDisplay();
		SwingUtilities.invokeLater(imageDisplay);
	}
	

}
```


----------



## L-ectron-X (17. Dez 2012)

... Swing und AWT sollten nicht gemischt werden.
Entweder Swing, dann aber kein Canvas sondern ein JPanel verwenden.
Oder Canvas und dann nur noch AWT-GUI-Komponenten verwenden. (Nicht JFrame, sondern Frame).


----------

