Habe Probleme beim Bild laden! *Update 30.11.2006*

Status
Nicht offen für weitere Antworten.

Cole

Bekanntes Mitglied
Halo,
habe mir ein kleines Tool gebastelt dass erstmal über einen FileChooser ein Bild laden sollte und es mir dann anzeigen.
Bin da so vorgegangen wie es in dem Buch "Java ist auch eine Insel" beschrieben wurde - fast.
Erstmal hier mein Code:
Klasse1 - da wird nur die GUI erzeugt:

Code:
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import java.awt.Dimension;
import javax.swing.JMenuBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import javax.swing.JMenu;
public class Gui {

	public JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="210,18"
	private JMenuBar jJMenuBar1 = null;
	private JMenu jMenu = null;
	Ereignishandling ereignisse = new Ereignishandling();  //  @jve:decl-index=0:

	/**
	 * This method initializes jFrame	
	 * 	
	 * @return javax.swing.JFrame	
	 */
	public JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setSize(new Dimension(717, 465));
			jFrame.setTitle("Bilddreher v0.x");
			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jFrame.setJMenuBar(getJJMenuBar1());
			jFrame.setVisible(true);
		
		}
		return jFrame;
	}
	/**
	 * This method initializes jJMenuBar1	
	 * 	
	 * @return javax.swing.JMenuBar	
	 */
	private JMenuBar getJJMenuBar1() {
		if (jJMenuBar1 == null) {
			jJMenuBar1 = new JMenuBar();
			jJMenuBar1.setPreferredSize(new Dimension(0, 30));
			jJMenuBar1.add(getJMenu());
		}
		return jJMenuBar1;
	}
	/**
	 * This method initializes jMenu	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu() {
		if (jMenu == null) {
			jMenu = new JMenu();
			jMenu.setText("Datei");
			
			JMenuItem dateiOeffnen = new JMenuItem("Datei öffnen");
			dateiOeffnen.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_MASK));
			ereignisse.OeffnenDialog(dateiOeffnen);
			jMenu.add(dateiOeffnen);			
			jMenu.addSeparator();
			
			JMenuItem ordnerOeffnen = new JMenuItem("Ordner öffnen");
			ordnerOeffnen.setAccelerator(KeyStroke.getKeyStroke('F', InputEvent.CTRL_MASK));
			jMenu.add(ordnerOeffnen);
			jMenu.addSeparator();
			
			JMenuItem speichernUnter = new JMenuItem("Speichern unter...");
			speichernUnter.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_MASK));
			jMenu.add(speichernUnter);
			jMenu.addSeparator();
			
			JMenuItem exit = new JMenuItem("Beenden");
			ereignisse.ShortcutsErstellen(exit, 'X');
			ereignisse.Exithandling(exit);
			jMenu.add(exit);
			
			
		}
		return jMenu;
	}


}

Klasse2 - Hier hab ich mal das Actionhandling reingepackt:
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.io.File;

import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.filechooser.FileFilter;

public class Ereignishandling extends JComponent{
	JFileChooser fileChooser = new JFileChooser();
	Image image ;

	
	  public void setImage( File file )
	  {
	    image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
	    if ( image != null )
	      repaint();
	  }
	  @Override
	  protected void paintComponent( Graphics g )
	  {
	    if ( image != null )
	      g.drawImage( image, 0, 0, this );
	  }
	

	public void ShortcutsErstellen(JMenuItem MenueEintrag, char c) {
		MenueEintrag.setAccelerator(KeyStroke.getKeyStroke(c,
				InputEvent.CTRL_MASK));

	}

	public void Exithandling(JMenuItem exit) {

		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
	}

	public void OeffnenDialog(JMenuItem dateiOeffnen) {
		dateiOeffnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg1) {

				fileChooser.setSize(100, 100);
				fileChooser.setDialogTitle("Bilddatei öffnen");
				fileChooser.setFileFilter( new FileFilter()
				    {
				      @Override
				      public boolean accept( File f )
				      {
				        return f.isDirectory() || f.getName().toLowerCase().endsWith( ".jpg" )
				            || f.getName().toLowerCase().endsWith( ".gif" );
				      }
				      @Override
				      public String getDescription()
				      {
				        return "*.jpg;*.gif";
				      }
				    } );
				switch (fileChooser.showOpenDialog(null)) {
				case JFileChooser.APPROVE_OPTION:
				    File bild = fileChooser.getSelectedFile();
				   setImage(bild);

//							InputStream in = new FileInputStream(fileChooser.getSelectedFile());
//							BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					
				


					break;
				case JFileChooser.CANCEL_OPTION:

					break;

				}
			}
		});

	}
}

Klasse3 - Die Main:
Code:
public class Main extends Gui {

		
	public static void main(String[] args) {
		Gui gui = new Gui();
		
		gui.getJFrame();
	}

}

Aber es wird mir jetzt nix angezeigt, ist ja auch klar, weil der Ausdruck
Code:
	      g.drawImage( image, 0, 0, this );
in der paintComponent Methode nix mit this anfangen kann. (Denk ich mir mal so).
Was muss ich dem denn da angeben? Eine Instanz von der KLasse Gui? Da wüsste ich aber nicht wie ich dran kommen soll.

Oder gibts gar einen besseren/einfacheren/eleganteren Weg?
 

André Uhres

Top Contributor
Code:
   public JFrame getJFrame() {
...
            jFrame.add(ereignisse);//<<--------------
            jFrame.setVisible(true);
        }
        return jFrame;
    }
 

Cole

Bekanntes Mitglied
Danke dir hat super funktioniert! Wäre ich aber glaub von allein nicht drauf gekommen!

[Edit]: Erledigt wegegemacht:

Wollte das geladene Bild verkleinert darstellen, hab mir das in etwa so gedacht:
Code:
	  public void setImage( File file )
	  {
	    image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
	    image.getScaledInstance(20, 20, Image.SCALE_FAST);
	    if ( image != null ){
	    repaint();
	    }
	  }

aber so wirklich funktionieren tuts nicht, die Größe bleibt so wie sie war.
Was muss ich denn da jetzt tun? Hab in der Forensuche geschaut, aber das was ich gefunden hab hat mich nicht wirklich weitergebracht.

[Edit] Habs doch noch hinbekommen!
 

Cole

Bekanntes Mitglied
Hab da nochmal ein Verständnis Problem:
Ich poste mal den Code, dann könnt ihrs ausprobieren, dann ist es leichter zu erklären:

Gui:
Code:
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import java.awt.Dimension;
import javax.swing.JMenuBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import javax.swing.JMenu;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.BorderLayout;
import javax.swing.JButton;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import java.awt.ComponentOrientation;
import javax.swing.SwingConstants;
public class Gui {

	public JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="210,18"
	private JMenuBar jJMenuBar1 = null;
	private JMenu jMenu = null;
	Ereignishandling ereignisse = new Ereignishandling();  //  @jve:decl-index=0:
	private JPanel jPanel = null;
	private JPanel jPanel1 = null;
	private JButton jButtonDrehung90Links = null;
	private JButton jButtonDrehung90Rechts = null;
	private JPanel jPanel2 = null;
	private JPanel jPanel3 = null;
	private JLabel jLabel = null;
	/**
	 * This method initializes jFrame	
	 * 	
	 * @return javax.swing.JFrame	
	 */
	public JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setSize(new Dimension(717, 465));
			jFrame.setTitle("Bilddreher v0.x");
			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jFrame.setJMenuBar(getJJMenuBar1());
			jFrame.setContentPane(getJPanel());
			jFrame.add(ereignisse);
			jFrame.setVisible(true);
		
		}
		return jFrame;
	}
	/**
	 * This method initializes jJMenuBar1	
	 * 	
	 * @return javax.swing.JMenuBar	
	 */
	private JMenuBar getJJMenuBar1() {
		if (jJMenuBar1 == null) {
			jJMenuBar1 = new JMenuBar();
			jJMenuBar1.setPreferredSize(new Dimension(0, 30));
			jJMenuBar1.add(getJMenu());
		}
		return jJMenuBar1;
	}
	/**
	 * This method initializes jMenu	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu() {
		if (jMenu == null) {
			jMenu = new JMenu();
			jMenu.setText("Datei");
			
			JMenuItem dateiOeffnen = new JMenuItem("Datei öffnen");
			dateiOeffnen.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_MASK));
			ereignisse.OeffnenDialog(dateiOeffnen);
			jMenu.add(dateiOeffnen);			
			jMenu.addSeparator();
			
			JMenuItem ordnerOeffnen = new JMenuItem("Ordner öffnen");
			ordnerOeffnen.setAccelerator(KeyStroke.getKeyStroke('F', InputEvent.CTRL_MASK));
			jMenu.add(ordnerOeffnen);
			jMenu.addSeparator();
			
			JMenuItem speichernUnter = new JMenuItem("Speichern unter...");
			speichernUnter.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_MASK));
			jMenu.add(speichernUnter);
			jMenu.addSeparator();
			
			JMenuItem exit = new JMenuItem("Beenden");
			ereignisse.ShortcutsErstellen(exit, 'X');
			ereignisse.Exithandling(exit);
			jMenu.add(exit);
			
			
		}
		return jMenu;
	}
	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new BorderLayout());
			jPanel.add(getJPanel1(), BorderLayout.NORTH);
			jPanel.add(getJPanel2(), BorderLayout.WEST);
		}
		return jPanel;
	}
	/**
	 * This method initializes jPanel1	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			jPanel1 = new JPanel();
			jPanel1.setLayout(new FlowLayout());
			jPanel1.setPreferredSize(new Dimension(100, 50));
			jPanel1.add(getjButtonDrehung90Links(), null);
			jPanel1.add(getjButtonDrehung90Rechts(), null);
		}
		return jPanel1;
	}
	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getjButtonDrehung90Links() {
		if (jButtonDrehung90Links == null) {
			jButtonDrehung90Links = new JButton();
			jButtonDrehung90Links.setText("90° links");
			ereignisse.drehung90Links(jButtonDrehung90Links);
		}
		return jButtonDrehung90Links;
	}
	/**
	 * This method initializes jButton1	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getjButtonDrehung90Rechts() {
		if (jButtonDrehung90Rechts == null) {
			jButtonDrehung90Rechts = new JButton();
			jButtonDrehung90Rechts.setText("90° rechts");
			ereignisse.drehung90rechts(jButtonDrehung90Rechts);
		}
		return jButtonDrehung90Rechts;
	}
	/**
	 * This method initializes jPanel2	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel2() {
		if (jPanel2 == null) {
			jPanel2 = new JPanel();
			jPanel2.setLayout(new BorderLayout());
			jPanel2.setPreferredSize(new Dimension(200, 0));
			jPanel2.add(getJPanel3(), BorderLayout.NORTH);
		}
		return jPanel2;
	}
	/**
	 * This method initializes jPanel3	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel3() {
		if (jPanel3 == null) {
			jLabel = new JLabel();
			jLabel.setText("Original");
			jPanel3 = new JPanel();
			jPanel3.setLayout(new FlowLayout());
			jPanel3.add(jLabel, null);
		}
		return jPanel3;
	}


}


Handling:
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.filechooser.FileFilter;

public class Ereignishandling extends JComponent{
	JFileChooser fileChooser = new JFileChooser();
	Image image ;

	  public void setImage( File file )
	  {
	    image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() ).getScaledInstance(100, 100, Image.SCALE_FAST);

	    if ( image != null ){
	    repaint();
	    }
	  } 
	  @Override
	  protected void paintComponent( Graphics g )
	  {
	    if ( image != null )

	      g.drawImage( image, 10, 0, this );
	
	  }

	public void ShortcutsErstellen(JMenuItem MenueEintrag, char c) {
		MenueEintrag.setAccelerator(KeyStroke.getKeyStroke(c,
				InputEvent.CTRL_MASK));

	}

	public void Exithandling(JMenuItem exit) {

		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
	}

	public void OeffnenDialog(JMenuItem dateiOeffnen) {
		dateiOeffnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg1) {

				fileChooser.setSize(100, 100);
				fileChooser.setDialogTitle("Bilddatei öffnen");
				fileChooser.setFileFilter( new FileFilter()
				    {
				      @Override
				      public boolean accept( File f )
				      {
				        return f.isDirectory() || f.getName().toLowerCase().endsWith( ".jpg" )
				            || f.getName().toLowerCase().endsWith( ".gif" );
				      }
				      @Override
				      public String getDescription()
				      {
				        return "*.jpg;*.gif";
				      }
				    } );
				switch (fileChooser.showOpenDialog(null)) {
				case JFileChooser.APPROVE_OPTION:
				    File bild = fileChooser.getSelectedFile();
				    
				   setImage(bild);

					break;
				case JFileChooser.CANCEL_OPTION:

					break;

				}
			}
		});

	}
	public void drehung90Links(JButton jButtonDrehung90Links) {

		jButtonDrehung90Links.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
	}
	
	public void drehung90rechts(JButton jButtonDrehung90Rechts) {

		jButtonDrehung90Rechts.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
	}
	
}


Main:
Code:
public class Main extends Gui {

		
	public static void main(String[] args) {
		Gui gui = new Gui();
		
		gui.getJFrame();
	}

}

Ich hätte jetzt gerne, dass das kleine Bild unter dem Schriftzug "Orignial" erscheint und nicht rechts daneben.
Rechts wollte ich eine Spalte machen mit "Bearbeitet".

Danke schonmal!
 

André Uhres

Top Contributor
Cole hat gesagt.:
..Ich hätte jetzt gerne, dass das kleine Bild unter dem Schriftzug "Orignial" erscheint und nicht rechts daneben...
Code:
   public JFrame getJFrame() {
...
//            jFrame.add(ereignisse);//<-----Bild hier wieder wegmachen
            jFrame.setVisible(true);
            
        }
        return jFrame;
    }
...
    private JPanel getJPanel() {
...
            jPanel.add(getJPanel1(), BorderLayout.NORTH);
            jPanel.add(getJPanel2(), BorderLayout.CENTER);//<-------------------
        }
        return jPanel;
    }
...
    private JPanel getJPanel2() {
...
            jPanel2.add(getJPanel3(), BorderLayout.NORTH);
            JPanel bilder = new JPanel(new GridLayout());//<--------------------
            bilder.add(ereignisse);//<----------------------Das originale Bild
            //bilder.add(...);//<-----Hier kommt später das bearbeitete Bild
            jPanel2.add(bilder);//<---------------------------------------------
        }
        return jPanel2;
    }
...
    private JPanel getJPanel3() {
...
            jPanel3 = new JPanel();
            jPanel3.setLayout(new GridLayout());//<----------------------------
            jPanel3.add(jLabel, null);
            jPanel3.add(new JLabel("Bearbeitet"));//<--------------------------
        }
        return jPanel3;
    }
...
    public void setImage( File file ) {
        image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() )
        .getScaledInstance(300, -1, Image.SCALE_SMOOTH);//<---------------------------
 

Cole

Bekanntes Mitglied
Hab gerade die Änderungen vorgenommen, aber leider wird das Bild nicht angezeigt.
Die Schriftzüge Original und Bearbeitet sind da, alles super, aber das Bild taucht nirgends auf.

Code:
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import java.awt.Dimension;
import javax.swing.JMenuBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import javax.swing.JMenu;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import java.awt.ComponentOrientation;
import javax.swing.SwingConstants;
public class Gui {

	public JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="210,18"
	private JMenuBar jJMenuBar1 = null;
	private JMenu jMenu = null;
	Ereignishandling ereignisse = new Ereignishandling();  //  @jve:decl-index=0:
	private JPanel jPanel = null;
	private JPanel jPanel1 = null;
	private JButton jButtonDrehung90Links = null;
	private JButton jButtonDrehung90Rechts = null;
	private JPanel jPanel2 = null;
	private JPanel jPanel3 = null;
	private JLabel jLabel = null;
	/**
	 * This method initializes jFrame	
	 * 	
	 * @return javax.swing.JFrame	
	 */
	public JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setSize(new Dimension(717, 465));
			jFrame.setTitle("Bilddreher v0.x");
			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jFrame.setJMenuBar(getJJMenuBar1());
			jFrame.setContentPane(getJPanel());
//			jFrame.add(ereignisse);
			jFrame.setVisible(true);
		
		}
		return jFrame;
	}
	/**
	 * This method initializes jJMenuBar1	
	 * 	
	 * @return javax.swing.JMenuBar	
	 */
	private JMenuBar getJJMenuBar1() {
		if (jJMenuBar1 == null) {
			jJMenuBar1 = new JMenuBar();
			jJMenuBar1.setPreferredSize(new Dimension(0, 30));
			jJMenuBar1.add(getJMenu());
		}
		return jJMenuBar1;
	}
	/**
	 * This method initializes jMenu	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu() {
		if (jMenu == null) {
			jMenu = new JMenu();
			jMenu.setText("Datei");
			
			JMenuItem dateiOeffnen = new JMenuItem("Datei öffnen");
			dateiOeffnen.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_MASK));
			ereignisse.OeffnenDialog(dateiOeffnen);
			jMenu.add(dateiOeffnen);			
			jMenu.addSeparator();
			
			JMenuItem ordnerOeffnen = new JMenuItem("Ordner öffnen");
			ordnerOeffnen.setAccelerator(KeyStroke.getKeyStroke('F', InputEvent.CTRL_MASK));
			jMenu.add(ordnerOeffnen);
			jMenu.addSeparator();
			
			JMenuItem speichernUnter = new JMenuItem("Speichern unter...");
			speichernUnter.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_MASK));
			jMenu.add(speichernUnter);
			jMenu.addSeparator();
			
			JMenuItem exit = new JMenuItem("Beenden");
			ereignisse.ShortcutsErstellen(exit, 'X');
			ereignisse.Exithandling(exit);
			jMenu.add(exit);
			
			
		}
		return jMenu;
	}
	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new BorderLayout());
			jPanel.add(getJPanel1(), BorderLayout.NORTH);
			jPanel.add(getJPanel2(), BorderLayout.CENTER);
		}
		return jPanel;
	}
	/**
	 * This method initializes jPanel1	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			jPanel1 = new JPanel();
			jPanel1.setLayout(new FlowLayout());
			jPanel1.setPreferredSize(new Dimension(100, 50));
			jPanel1.add(getjButtonDrehung90Links(), null);
			jPanel1.add(getjButtonDrehung90Rechts(), null);
		}
		return jPanel1;
	}
	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getjButtonDrehung90Links() {
		if (jButtonDrehung90Links == null) {
			jButtonDrehung90Links = new JButton();
			jButtonDrehung90Links.setText("90° links");
			ereignisse.drehung90Links(jButtonDrehung90Links);
		}
		return jButtonDrehung90Links;
	}
	/**
	 * This method initializes jButton1	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getjButtonDrehung90Rechts() {
		if (jButtonDrehung90Rechts == null) {
			jButtonDrehung90Rechts = new JButton();
			jButtonDrehung90Rechts.setText("90° rechts");
			ereignisse.drehung90rechts(jButtonDrehung90Rechts);
		}
		return jButtonDrehung90Rechts;
	}
	/**
	 * This method initializes jPanel2	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel2() {
		if (jPanel2 == null) {
			jPanel2 = new JPanel();
			jPanel2.add(getJPanel3(), BorderLayout.NORTH);
			JPanel bilder = new JPanel(new GridLayout());
			bilder.add(ereignisse);
//			jPanel2.setLayout(new BorderLayout());
//			jPanel2.setPreferredSize(new Dimension(200, 0));
			jPanel2.add(bilder);

		}
		return jPanel2;
	}
	/**
	 * This method initializes jPanel3	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel3() {
		if (jPanel3 == null) {
			jLabel = new JLabel();
			jLabel.setText("Original");
			jPanel3 = new JPanel();
			jPanel3.setLayout(new GridLayout());
			jPanel3.add(jLabel, null);
			jPanel3.add(new JLabel("Bearbeitet"));
		}
		return jPanel3;
	}


}


Code:
image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() ).getScaledInstance(300, -1, Image.SCALE_SMOOTH);
 

André Uhres

Top Contributor
Code:
  private JPanel getJPanel2() {
      if (jPanel2 == null) {
         jPanel2 = new JPanel();
         jPanel2.setLayout(new BorderLayout());//<---du hast das BorderLayout irrtümlich entfernt !
 

Cole

Bekanntes Mitglied
Hab das Borderlayout wieder reingemacht, jetzt wird das Bild auch wieder angezeigt.
Aber die 2 Labels Original und bearbeitet erscheinen nicht mehr :(
Was ist denn da los?
 

André Uhres

Top Contributor
Cole hat gesagt.:
Hab das Borderlayout wieder reingemacht, jetzt wird das Bild auch wieder angezeigt.
Aber die 2 Labels Original und bearbeitet erscheinen nicht mehr :(
Was ist denn da los?
Funzt aber bei mir:
Code:
package paint;
/*
 * Main.java
 */
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
public class Main extends Gui {
    public static void main(String[] args) {
        Gui gui = new Gui();
        gui.getJFrame();
    }
}
class Gui {
    public JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="210,18"
    private JMenuBar jJMenuBar1 = null;
    private JMenu jMenu = null;
    Ereignishandling ereignisse = new Ereignishandling();  //  @jve:decl-index=0:
    private JPanel jPanel = null;
    private JPanel jPanel1 = null;
    private JButton jButtonDrehung90Links = null;
    private JButton jButtonDrehung90Rechts = null;
    private JPanel jPanel2 = null;
    private JPanel jPanel3 = null;
    private JLabel jLabel = null;
    /**
     * This method initializes jFrame
     * @return JFrame
     */
    public JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setSize(new Dimension(717, 465));
            jFrame.setTitle("Bilddreher v0.x");
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setJMenuBar(getJJMenuBar1());
            jFrame.setContentPane(getJPanel());
//         jFrame.add(ereignisse);
            jFrame.setVisible(true);
        }
        return jFrame;
    }
    /**
     * This method initializes jJMenuBar1
     * @return JMenuBar
     */
    private JMenuBar getJJMenuBar1() {
        if (jJMenuBar1 == null) {
            jJMenuBar1 = new JMenuBar();
            jJMenuBar1.setPreferredSize(new Dimension(0, 30));
            jJMenuBar1.add(getJMenu());
        }
        return jJMenuBar1;
    }
    /**
     * This method initializes jMenu
     * @return JMenu
     */
    private JMenu getJMenu() {
        if (jMenu == null) {
            jMenu = new JMenu();
            jMenu.setText("Datei");
            JMenuItem dateiOeffnen = new JMenuItem("Datei öffnen");
            dateiOeffnen.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_MASK));
            ereignisse.OeffnenDialog(dateiOeffnen);
            jMenu.add(dateiOeffnen);
            jMenu.addSeparator();
            JMenuItem ordnerOeffnen = new JMenuItem("Ordner öffnen");
            ordnerOeffnen.setAccelerator(KeyStroke.getKeyStroke('F', InputEvent.CTRL_MASK));
            jMenu.add(ordnerOeffnen);
            jMenu.addSeparator();
            JMenuItem speichernUnter = new JMenuItem("Speichern unter...");
            speichernUnter.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_MASK));
            jMenu.add(speichernUnter);
            jMenu.addSeparator();
            JMenuItem exit = new JMenuItem("Beenden");
            ereignisse.ShortcutsErstellen(exit, 'X');
            ereignisse.Exithandling(exit);
            jMenu.add(exit);
        }
        return jMenu;
    }
    /**
     * This method initializes jPanel
     * @return JPanel
     */
    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(new BorderLayout());
            jPanel.add(getJPanel1(), BorderLayout.NORTH);
            jPanel.add(getJPanel2(), BorderLayout.CENTER);
        }
        return jPanel;
    }
    /**
     * This method initializes jPanel1
     * @return JPanel
     */
    private JPanel getJPanel1() {
        if (jPanel1 == null) {
            jPanel1 = new JPanel();
            jPanel1.setLayout(new FlowLayout());
            jPanel1.setPreferredSize(new Dimension(100, 50));
            jPanel1.add(getjButtonDrehung90Links(), null);
            jPanel1.add(getjButtonDrehung90Rechts(), null);
        }
        return jPanel1;
    }
    /**
     * This method initializes jButton
     * @return JButton
     */
    private JButton getjButtonDrehung90Links() {
        if (jButtonDrehung90Links == null) {
            jButtonDrehung90Links = new JButton();
            jButtonDrehung90Links.setText("90° links");
            ereignisse.drehung90Links(jButtonDrehung90Links);
        }
        return jButtonDrehung90Links;
    }
    /**
     * This method initializes jButton1
     * @return JButton
     */
    private JButton getjButtonDrehung90Rechts() {
        if (jButtonDrehung90Rechts == null) {
            jButtonDrehung90Rechts = new JButton();
            jButtonDrehung90Rechts.setText("90° rechts");
            ereignisse.drehung90rechts(jButtonDrehung90Rechts);
        }
        return jButtonDrehung90Rechts;
    }
    /**
     * This method initializes jPanel2
     * @return JPanel
     */
    private JPanel getJPanel2() {
        if (jPanel2 == null) {
            jPanel2 = new JPanel();
            jPanel2.setLayout(new BorderLayout());
            jPanel2.add(getJPanel3(), BorderLayout.NORTH);
            JPanel bilder = new JPanel(new GridLayout());
            bilder.add(ereignisse);
//         jPanel2.setPreferredSize(new Dimension(200, 0));
            jPanel2.add(bilder);
        }
        return jPanel2;
    }
    /**
     * This method initializes jPanel3
     * @return JPanel
     */
    private JPanel getJPanel3() {
        if (jPanel3 == null) {
            jLabel = new JLabel();
            jLabel.setText("Original");
            jPanel3 = new JPanel();
            jPanel3.setLayout(new GridLayout());
            jPanel3.add(jLabel, null);
            jPanel3.add(new JLabel("Bearbeitet"));
        }
        return jPanel3;
    }
}
class Ereignishandling extends JComponent{
    JFileChooser fileChooser = new JFileChooser();
    Image image ;
    public void setImage( File file ) {
        image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() ).getScaledInstance(300, -1, Image.SCALE_SMOOTH);
        if ( image != null ){
            repaint();
        }
    }
    @Override
            protected void paintComponent( Graphics g ) {
        if ( image != null )
            g.drawImage( image, 10, 0, this );
    }
    public void ShortcutsErstellen(JMenuItem MenueEintrag, char c) {
        MenueEintrag.setAccelerator(KeyStroke.getKeyStroke(c,
                InputEvent.CTRL_MASK));
    }
    public void Exithandling(JMenuItem exit) {
        exit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        });
    }
    public void OeffnenDialog(JMenuItem dateiOeffnen) {
        dateiOeffnen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg1) {
                fileChooser.setSize(100, 100);
                fileChooser.setDialogTitle("Bilddatei öffnen");
                fileChooser.setFileFilter( new FileFilter() {
                    @Override
                            public boolean accept( File f ) {
                        return f.isDirectory() || f.getName().toLowerCase().endsWith( ".jpg" )
                        || f.getName().toLowerCase().endsWith( ".gif" );
                    }
                    @Override
                            public String getDescription() {
                        return "*.jpg;*.gif";
                    }
                } );
                switch (fileChooser.showOpenDialog(null)) {
                    case JFileChooser.APPROVE_OPTION:
                        File bild = fileChooser.getSelectedFile();
                        setImage(bild);
                        break;
                    case JFileChooser.CANCEL_OPTION:
                        break;
                }
            }
        });
    }
    public void drehung90Links(JButton jButtonDrehung90Links) {
        jButtonDrehung90Links.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        });
    }
    public void drehung90rechts(JButton jButtonDrehung90Rechts) {
        jButtonDrehung90Rechts.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        });
    }
}
 

Cole

Bekanntes Mitglied
Hab mal deinen Code kopiert, damit funzt es bei mir auch. :)
Muss ich mal am Wochenende drüber gehen und mir anschauen was da jetzt der Unterschied ist.
Gibts da in Eclipse ne Funktion mit der ich 2 Klassen vergleichen kann?
 

André Uhres

Top Contributor
Dies kann man gratis im Internet downloaden: ExamDiff - Visual File Comparison Tool
Aber ich bin nicht sicher ob es dir in diesem Fall etwas nützt: ich hab deinen Code nämlich neu formatiert :D
 

Cole

Bekanntes Mitglied
Ich brauch nochmal eure Hilfe, ich schnall grad gar nix mehr.
Also, ein Bild ist geladen, und dass wollte ich über nen Button drehen, und dann rechts neben dem alten Bild anzeigen lassen.
Hab mal versucht das gleiche Bild unbearbeitet zu TEstzwecken rechts anzeigen zu lassen, aber das hat auch nicht geklappt. Hab das so probiert:

Code:
   private JPanel getJPanel2() {
        if (jPanel2 == null) {
            jPanel2 = new JPanel();
            jPanel2.setLayout(new BorderLayout());
            jPanel2.add(getJPanel3(), BorderLayout.NORTH);
            JPanel bilder = new JPanel(new GridLayout());
            bilder.add(ereignisse);
      bilder.add(ereignisse); // <-- Hier einfach doppelt rein, bekomme aber nur ein Bild angezeigt
//         jPanel2.setPreferredSize(new Dimension(200, 0));
            jPanel2.add(bilder);
        }
        return jPanel2;
    }

Aber da funzt gar nix :( Könnt ihr euch das mal anschauen und mir erklären?
Hier mal das ganze Projekt:

Code:
public class Main extends Gui {

		
	public static void main(String[] args) {
		Gui gui = new Gui();
		
		gui.getJFrame();
	}

}

Code:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.filechooser.FileFilter;

public class Ereignishandling extends JComponent{
	JFileChooser fileChooser = new JFileChooser();
	Image image ;
	Image image2;
	BufferedImage temp = null;

	  public void setImage( File file )
	  {
	    image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() ).getScaledInstance(300, -1, Image.SCALE_SMOOTH);

	    if ( image != null ){
	    repaint();
	    }
	  } 
	  @Override
	  protected void paintComponent( Graphics g )
	  {
	    if ( image != null )

	      g.drawImage( image, 10, 0, this );
	
	  }

	public void ShortcutsErstellen(JMenuItem MenueEintrag, char c) {
		MenueEintrag.setAccelerator(KeyStroke.getKeyStroke(c,
				InputEvent.CTRL_MASK));

	}

	public void Exithandling(JMenuItem exit) {

		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
	}

	public void OeffnenDialog(JMenuItem dateiOeffnen) {
		dateiOeffnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg1) {

				fileChooser.setSize(100, 100);
				fileChooser.setDialogTitle("Bilddatei öffnen");
				fileChooser.setFileFilter( new FileFilter()
				    {
				      @Override
				      public boolean accept( File f )
				      {
				        return f.isDirectory() || f.getName().toLowerCase().endsWith( ".jpg" )
				            || f.getName().toLowerCase().endsWith( ".gif" );
				      }
				      @Override
				      public String getDescription()
				      {
				        return "*.jpg;*.gif";
				      }
				    } );
				switch (fileChooser.showOpenDialog(null)) {
				case JFileChooser.APPROVE_OPTION:
				    File bild = fileChooser.getSelectedFile();
				    
				   setImage(bild);

					break;
				case JFileChooser.CANCEL_OPTION:

					break;

				}
			}
		});

	}
	public void drehung90Links(JButton jButtonDrehung90Links) {

		jButtonDrehung90Links.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//TODO
			}
		});
	}
	
	public Image drehung90rechts(JButton jButtonDrehung90Rechts) {

		jButtonDrehung90Rechts.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				dreheBild(image);
			
			}
		});
		return image;
	}

        //Hier ist die Methode die mir das Bild drehen sollte
	protected Image dreheBild(Image image) {
		temp = new BufferedImage(image.getHeight(null), image.getWidth(null), 0);
		Graphics2D g = (Graphics2D) temp.getGraphics();
		g.setTransform(AffineTransform.getRotateInstance(-Math.PI/2));
		g.drawImage(image, 0, -image.getWidth(null), null);
		return temp;
		
	}
	
}

Code:
class Gui {
    public JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="210,18"
    private JMenuBar jJMenuBar1 = null;
    private JMenu jMenu = null;
    Ereignishandling ereignisse = new Ereignishandling();  //  @jve:decl-index=0:
    private JPanel jPanel = null;
    private JPanel jPanel1 = null;
    private JButton jButtonDrehung90Links = null;
    private JButton jButtonDrehung90Rechts = null;
    private JPanel jPanel2 = null;
    private JPanel jPanel3 = null;
    private JLabel jLabel = null;
	/**
     * This method initializes jFrame
     * @return JFrame
     */
    public JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setSize(new Dimension(717, 465));
            jFrame.setTitle("Bilddreher v0.x");
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setJMenuBar(getJJMenuBar1());
            jFrame.setContentPane(getJPanel());
//         jFrame.add(ereignisse);
            jFrame.setVisible(true);
        }
        return jFrame;
    }
    /**
     * This method initializes jJMenuBar1
     * @return JMenuBar
     */
    private JMenuBar getJJMenuBar1() {
        if (jJMenuBar1 == null) {
            jJMenuBar1 = new JMenuBar();
            jJMenuBar1.setPreferredSize(new Dimension(0, 30));
            jJMenuBar1.add(getJMenu());
        }
        return jJMenuBar1;
    }
    /**
     * This method initializes jMenu
     * @return JMenu
     */
    private JMenu getJMenu() {
        if (jMenu == null) {
            jMenu = new JMenu();
            jMenu.setText("Datei");
            JMenuItem dateiOeffnen = new JMenuItem("Datei öffnen");
            dateiOeffnen.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_MASK));
            ereignisse.OeffnenDialog(dateiOeffnen);
            jMenu.add(dateiOeffnen);
            jMenu.addSeparator();
            JMenuItem ordnerOeffnen = new JMenuItem("Ordner öffnen");
            ordnerOeffnen.setAccelerator(KeyStroke.getKeyStroke('F', InputEvent.CTRL_MASK));
            jMenu.add(ordnerOeffnen);
            jMenu.addSeparator();
            JMenuItem speichernUnter = new JMenuItem("Speichern unter...");
            speichernUnter.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_MASK));
            jMenu.add(speichernUnter);
            jMenu.addSeparator();
            JMenuItem exit = new JMenuItem("Beenden");
            ereignisse.ShortcutsErstellen(exit, 'X');
            ereignisse.Exithandling(exit);
            jMenu.add(exit);
        }
        return jMenu;
    }
    /**
     * This method initializes jPanel
     * @return JPanel
     */
    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(new BorderLayout());
            jPanel.add(getJPanel1(), BorderLayout.NORTH);
            jPanel.add(getJPanel2(), BorderLayout.CENTER);
        }
        return jPanel;
    }
    /**
     * This method initializes jPanel1
     * @return JPanel
     */
    private JPanel getJPanel1() {
        if (jPanel1 == null) {
            jPanel1 = new JPanel();
            jPanel1.setLayout(new FlowLayout());
            jPanel1.setPreferredSize(new Dimension(100, 50));
            jPanel1.add(getjButtonDrehung90Links(), null);
            jPanel1.add(getjButtonDrehung90Rechts(), null);
        }
        return jPanel1;
    }
    /**
     * This method initializes jButton
     * @return JButton
     */
    private JButton getjButtonDrehung90Links() {
        if (jButtonDrehung90Links == null) {
            jButtonDrehung90Links = new JButton();
            jButtonDrehung90Links.setText("90° links");
            ereignisse.drehung90Links(jButtonDrehung90Links);
        }
        return jButtonDrehung90Links;
    }
    /**
     * This method initializes jButton1
     * @return JButton
     */
    private JButton getjButtonDrehung90Rechts() {
        if (jButtonDrehung90Rechts == null) {
            jButtonDrehung90Rechts = new JButton();
            jButtonDrehung90Rechts.setText("90° rechts");
            ereignisse.drehung90rechts(jButtonDrehung90Rechts);
        }
        return jButtonDrehung90Rechts;
    }
    /**
     * This method initializes jPanel2
     * @return JPanel
     */
    private JPanel getJPanel2() {
        if (jPanel2 == null) {
            jPanel2 = new JPanel();
            jPanel2.setLayout(new BorderLayout());
            jPanel2.add(getJPanel3(), BorderLayout.NORTH);
            JPanel bilder = new JPanel(new GridLayout());
            bilder.add(ereignisse);

//         jPanel2.setPreferredSize(new Dimension(200, 0));
            jPanel2.add(bilder);
        }
        return jPanel2;
    }
    /**
     * This method initializes jPanel3
     * @return JPanel
     */
    private JPanel getJPanel3() {
        if (jPanel3 == null) {
            jLabel = new JLabel();
            jLabel.setText("Original");
            jPanel3 = new JPanel();
            jPanel3.setLayout(new GridLayout());
            jPanel3.add(jLabel, null);
            jPanel3.add(new JLabel("Bearbeitet"));
        }
        return jPanel3;
    }
}
Danke schonmal![/code]
 

André Uhres

Top Contributor
Code:
class Gui {
...
    private JPanel bilder;
    Ereignishandling ereignisse = new Ereignishandling(this);  //  @jve:decl-index=0:
    private ZweitesBild bild2;
...
    private JPanel getJPanel2() {
        if (jPanel2 == null) {
            jPanel2 = new JPanel();
            jPanel2.setLayout(new BorderLayout());
            jPanel2.add(getJPanel3(), BorderLayout.NORTH);
            bilder = new JPanel(new GridLayout());
            bilder.add(ereignisse);
            bild2 = new ZweitesBild();
            bilder.add(bild2);
            jPanel2.add(bilder);
        }
        return jPanel2;
    }
    public ZweitesBild getZweitesBild() {
        return bild2;
    }
...
}

class Ereignishandling extends JComponent{
...
    Image temp = null;
    private Gui gui;
    public Ereignishandling(Gui gui){
        this.gui = gui;
    }
...
    protected Image dreheBild(Image image) {
        temp = createImage(image.getHeight(null), image.getWidth(null));
        Graphics2D g = (Graphics2D) temp.getGraphics();
        g.rotate((Math.PI / 2), 0, 0);
        g.drawImage(image, 0, -image.getHeight(null), null);
        gui.getZweitesBild().setImage(temp);
        return temp;
    }
}
class ZweitesBild extends JPanel{
    private Image image2;
    public void setImage( Image img) {
        image2 = img;
        repaint();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        if ( image2 != null )
            g.drawImage( image2, 10, 0, this );
    }
}
 

Cole

Bekanntes Mitglied
Krasse scheisse, hat perfekt funktionert!!
Danke dir!!
Werde jetzt erstmal vesuchen das nachzuvollziehen, wenn ich wieder Fragen hab poste ich hier.

OT: Wenn ich einen Beitrag von mir editiere, wird der Thread dann in der Liste hochgeschoben, oder funzt das nur bei neuen Antworten?

[Edit]: Da hab ich schon mal wieder ne Frage:
Wollte grad das Gleiche noch für den Button links einbauen, im Actionlistener.
Schaut so aus:
Code:
protected Image dreheBildlinks(Image image) {
		
        temp = createImage(image.getHeight(null), image.getWidth(null));
        Graphics2D g = (Graphics2D) temp.getGraphics();
        g.rotate((Math.PI*1.5 ),0, 0);   <-- 270°
        g.drawImage(image, 0, -image.getHeight(null), null);
        gui.getZweitesBild().setImage(temp);
        return temp;
     		
}

Es tut sich aber nix. Wo liegt denn mein Denkfehler?

[Edit]: Habs doch noch hinbekommen!!


[Edit]: Aber ein anderes Problem, und zwar wenn ich um 180 ° drehen will. Hab das so gemacht:
Code:
	protected Image dreheBild180(Image image2) {
        temp = createImage(image.getHeight(null), image.getWidth(null));
        Graphics2D g = (Graphics2D) temp.getGraphics();
        g.rotate((Math.PI),(temp.getWidth(null)/2),0 );
        g.drawImage(image, 0, -image.getHeight(null), null);
        gui.getZweitesBild().setImage(temp);
        return temp;
		
	}

Die Drehung an sich klappt gut, nur wird das Vorschaubild gestaucht, es sieht so aus als ob es als Breite die Höhe vom Originalbild bekommt. WIe kann ich das ändern?
 

André Uhres

Top Contributor
Cole hat gesagt.:
OT: Wenn ich einen Beitrag von mir editiere, wird der Thread dann in der Liste hochgeschoben
Das hatte ich vor ein paar Wochen im Sitecheck "Feedback - java-forum.org" als Option angefragt,
aber es wurde bis jetzt nicht gemacht:
http://www.java-forum.org/de/viewtopic.php?p=231835#231835

Cole hat gesagt.:
ein anderes Problem, und zwar wenn ich um 180 ° drehen will
So wird bei jedem Klick auf "90° rechts" das Bild jeweils um 90° weitergedreht:
Code:
class Ereignishandling extends JComponent{
...
    private double winkel;
...
    protected void paintComponent( Graphics g ) {
        super.paintComponent(g);
        if ( image == null ) return;
        //Bild im Panel zentriert malen:
        int x = (getWidth() - image.getWidth(this))/2;
        int y = (getHeight() - image.getHeight(this))/2;
        g.drawImage(image, x, y, this);
    }
...
    protected void dreheBild(Image image2) {
        winkel += 90;
        if (winkel >= 360) winkel = 0;
        gui.getZweitesBild().setImage(image, winkel);
    }
}
class ZweitesBild extends JPanel{
    private Image image;
    private double winkel;
    public void setImage( Image img, double winkel) {
        this.winkel = winkel;
        image = img;
        repaint();
    }
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(image == null)return ;
        Graphics2D g2d = (Graphics2D)g;
        AffineTransform origXform = g2d.getTransform();
        AffineTransform newXform = (AffineTransform)(origXform.clone());
        //Zentrum der Drehung ist das Zentrum des Panels:
        int xRot = this.getWidth()/2;
        int yRot = this.getHeight()/2;
        newXform.rotate(Math.toRadians(winkel), xRot, yRot);
        g2d.setTransform(newXform);
        //Bild im Panel zentriert malen:
        int x = (getWidth() - image.getWidth(this))/2;
        int y = (getHeight() - image.getHeight(this))/2;
        g2d.drawImage(image, x, y, this);
        g2d.setTransform(origXform);
    }
}
 

Cole

Bekanntes Mitglied
Danke, ich werds heute abend mal einbauen.
Kannst du mir trotzdem noch erklären, was falsch war? Wie schon gesagt, die Drehung an sich hat wunderbar geklappt, das Problem war ja nur, dass das Vorschaubild so scheisse ausgesehen hat!
 

Cole

Bekanntes Mitglied
Hehe, das ist ja crazy. Hab grad schnell die 2. Varainte ausprobiert, also temp = createImage(image.getWidth(null), image.getHeight(null)); und damit geht es hervorragned. Werde dann wohl bei dieser Variante bleiben. Danke nochmal für die fixe Hilfe!
 

Cole

Bekanntes Mitglied
[Edit]: So wies aussieht hat es sich erledigt, habs hinbekommen. Zumindest vorläufig mal :)

[Edit]: Zu früh gefreut :/

Wie kann ich mir denn die Höhe und die Breite des Originalbildes holen?
Beim Öffnen der Datei schreib ich das:

Code:
			case JFileChooser.APPROVE_OPTION:
				    File bild = fileChooser.getSelectedFile();
				    
		-->		    originalBreite = Toolkit.getDefaultToolkit().getImage(bild.getAbsolutePath()).getWidth(null);
		-->		    originalHoehe = Toolkit.getDefaultToolkit().getImage(bild.getAbsolutePath()).getHeight(null);
				    
				    setImage(bild);
					break;

Wenn ich dann aber originalBreite und originalHoehe ausgeben lasse bekomm ich als Ergebnis immer -1 und 0.

Warum?
 

André Uhres

Top Contributor
Versuch's mal so:
Code:
ImageIcon icon = new ImageIcon(bild.getAbsolutePath()); 
System.out.println(icon.getIconWidth()+" "+icon.getIconHeight());
 

Cole

Bekanntes Mitglied
Mit deiner Variante hats geklappt, danke.
Kannst du mir aber bitte erklären, warum ich da erst den Umweg über das ImageIcon gehen muss?
 

André Uhres

Top Contributor
Cole hat gesagt.:
Mit deiner Variante hats geklappt, danke.
Kannst du mir aber bitte erklären, warum ich da erst den Umweg über das ImageIcon gehen muss?
Naja, das mit dem Toolkit ist wahrscheinlich nicht mehr die aktuell empfehlenswerte Methode.
So geht's aber auch ohne ImageIcon:
Code:
                       Image img = null;
                        try {
                            img = ImageIO.read(bild);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        originalBreite = img.getWidth(null);
                        originalHoehe = img.getHeight(null);
 

Cole

Bekanntes Mitglied
Ein erneutes Problem:
Habs mal soweit gemacht, dass ich das gedrehte Bild wegspeichern kann, das sieht so aus:

Code:
public void SpeichernDialog(JMenuItem speichernUnter) {
		speichernUnter.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				fileChooser.setSize(100, 100);
				fileChooser.setDialogTitle("Bilddatei speichern unter...");
				fileChooser.setFileFilter( new FileFilter()
				    {
				      @Override
				      public boolean accept( File f )
				      {
				        return f.isDirectory() || f.getName().toLowerCase().endsWith( ".jpg" )
				            || f.getName().toLowerCase().endsWith( ".gif" );
				      }
				      @Override
				      public String getDescription()
				      {
		
		        return "*.jpg;*.gif";
				      }
				    } );
				switch (fileChooser.showSaveDialog(null)) {
				case JFileChooser.APPROVE_OPTION:
				            
		              		BufferedImage bi = new BufferedImage( 100, 100, BufferedImage.TYPE_INT_RGB );
							Graphics2D g2d = bi.createGraphics();
				                       g2d.drawImage( bufferedImage, 10, 0, null );
							g2d.dispose();
							
							String typ = "jpg";
							File datei = fileChooser.getSelectedFile();
							try {
							ImageIO.write( bufferedImage, typ, datei );
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
	

					break;
				case JFileChooser.CANCEL_OPTION:

					break;

			}

			}
		});
		
	}

So wird aber natürlich nur das kleinskalierte Bild abgespeichert. Gut, kein Problem dachte ich mir, dann hohl ich mir eben eine scaledInstance (siehe unten) aber das funktioniert nicht, bekomme da einen Typfehler und wenn ich nen Cast mach, bekomm ich einen Laufzeitfehler.

Code:
case JFileChooser.APPROVE_OPTION:
				            
		              		BufferedImage bi = new BufferedImage( 100, 100, BufferedImage.TYPE_INT_RGB );
							Graphics2D g2d = bi.createGraphics();
					-->		bufferedImage = bufferedImage.getScaledInstance(500, 500, bufferedImage.SCALE_SMOOTH);
				            g2d.drawImage( bufferedImage, 10, 0, null );
							g2d.dispose();
							
							String typ = "jpg";
							File datei = fileChooser.getSelectedFile();
							try {
							ImageIO.write( bufferedImage, typ, datei );
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}

Die 500/500 sind nur exemplarisch zum Ausprobieren!

Wie bekomm ich es jetzt hin, dass das Bild erst wieder groß wird und danach gespeichert wird?
 

André Uhres

Top Contributor
Spontan würde ich sagen, daß das so eh nicht gehen kann.
Wenn man das verkleinerte Bild wieder vergrössert, führt das logischerweise zu einem Qualitätsverlust.
 

Cole

Bekanntes Mitglied
Ja, das mit dem Qualitätsverlust stimmt schon.
Eigentlich sollte ich nur das ursprüngliche Bild drehen und speichern und nicht das Thumbnail.

Aber trotzdem meine Frage, wieso das mit dem Bild wieder groß machen nicht so funktioniert?
 

André Uhres

Top Contributor
Beim Kompilieren bekomme diese Fehlermeldung:
cannot find symbol
symbol: variable bufferedImage

Der Typfehler bedeutet ganz einfach, daß getScaledInstance ein Image zurückgibt das kein BufferedImage ist.
 

Cole

Bekanntes Mitglied
André Uhres hat gesagt.:
Der Typfehler bedeutet ganz einfach, daß getScaledInstance ein Image zurückgibt das kein BufferedImage ist.

Ja, das weiss ich. Hab dann mal versucht nen Cast drauf zumachen, dann funktioniert zwar das kompilieren, aber wenn ich es laufen lass und das Bild speichern will, bekomm ich diesesn Fehler:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.ToolkitImage
at Ereignishandling$3.actionPerformed(Ereignishandling.java:140)
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.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.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.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(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)
 

Cole

Bekanntes Mitglied
Hmm. Naja ist jetzt auch egal, hat sich erledigt.
Ich habs aufgetrennt, einmal das richtige Bild das im Hintergrund nur gedreht wird und dann wieder rausgespeicehrt und dann noch die Thumbnails extra gemacht.
Hat ganz ordenlich funktioniert!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
R AWT Ich verstehe die Fehlermeldung nicht. Was habe ich falsch gemacht? AWT, Swing, JavaFX & SWT 85
S Swing JFrame hat nicht die Größe, die ich eingegeben habe AWT, Swing, JavaFX & SWT 3
T hallo, habe ein Problem mit dem pro. eines Threads AWT, Swing, JavaFX & SWT 4
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
M Ich habe Werte und Brauche Grafik! AWT, Swing, JavaFX & SWT 3
F Habe Problem mit dem Abfangen einer Exception AWT, Swing, JavaFX & SWT 10
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
M Probleme mit Verkleinern eines GUI AWT, Swing, JavaFX & SWT 7
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
T JTable Graphik probleme AWT, Swing, JavaFX & SWT 3
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
P Probleme mit setIconImage AWT, Swing, JavaFX & SWT 8
U Swing Probleme mit Asynchronen Prozessen und Swing: AWT, Swing, JavaFX & SWT 3
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben