Image auf ein Canvas abbilden

PAS

Mitglied
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...

Java:
...
        );
        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();
      }
       ...
 
Zuletzt bearbeitet von einem Moderator:

dayaftereh

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

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

PAS

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

PAS

Mitglied
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

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

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

PAS

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

PAS

Mitglied
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... :-(

Java:
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

Top Contributor
Also die Paint Method wird aufgerufen?

Dann würde ich mal das Bild wie folgt laden:
Java:
File file = new File(datei);
img = ImageIO.read(file);
 

dayaftereh

Top Contributor
Löschen!
Java:
          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:

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

PAS

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

PAS

Mitglied
Hab jetzt:

Java:
      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

Top Contributor
Schau mal hier, habe ein Kleines Beispiel Programmiert:
Java:
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

Gesperrter Benutzer
... 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).
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Neue Themen


Oben