# java.lang.OutOfMemoryError: Java



## SBS (23. Sep 2006)

Ich erhalte diese Fehlermeldung wenn ich versuche mehrere byte[] in einen Vector zu schieben, die Arrays enthalten Kopien ganzer Dateien, nach einer gewissen Anzahl kommt diese FEhlermeldung - gibt es eine Möglichkeit das zu vermeiden OHNE dass ich das gesamte Code-Konzept jetzt über den Haufen werfe, da ich das Montag abgeben muss?


Exception in thread "No.2]" java.lang.OutOfMemoryError: Java heap space


----------



## André Uhres (23. Sep 2006)

Die "initial heap size" hängt von der jeweiligen JVM Implementation ab, 
ebenso die "maximum heap size". Du kannst aber einen oder beide Werte anders setzen indem
du die -Xms und -Xmx Optionen beim Starten der JVM nimmst, wobei die -Xms Option die
"initial heap size" und -Xmx die "maximum heap size" angibt.
Zum Beispiel für 300MB "initial heap size" und 300MB "maximum heap size":
java -Xms300m -Xmx300m MeinProg


----------



## SBS (23. Sep 2006)

Sehr gut, vielen Dank!

Weiß zufällig jemand, wo ich dieses Parameter mitangebe wenn ich meine Anwendung aus Eclipse heraus starte?

Bei Run bei den Arguments nehme ich an - dort bei Program Arguments oder bei VM Arguments?


----------



## André Uhres (23. Sep 2006)

Run | Run...
Den "(x)=Arguments"-Tab auswählen
VM arguments:
-Xms300m -Xmx300m


----------



## SBS (23. Sep 2006)

Alles klar,

mal so als Richtwert, sind 300 viel? sehr viel?

Was wird denn standardmäßig gesetzt?

Bis zu welcher Größe ists empfehlenswert?

Diese 300Mb werden dann vom ARbeitsspeicher des Systems abgeknappst? d.h. der Rechner muss mindestens soviel besitzen?


----------



## André Uhres (23. Sep 2006)

Defaults:
initial heap size:  2 MB
maximum heap size: 64 MB (das Limit liegt bei 2GB)
Die optimale heap size ist stark anwendungsabhängig, daher ist es eine Empfehlung nicht so einfach.

Die heap size sollte jedenfalls kleiner sein als der physische Hauptspeicher.
Wenn mehrere Java Anwendungen geichzeitig laufen, dann sollte die Summe der Java heaps 
ebenfalls nicht die Grösse des Hauptspeichers überschreiten.
Ein grosser Server könnte gut 1000 MB heap size benötigen.
Das gibt dir in etwa eine Vorstellung wo sich die 300 MB auf der Skala befinden.


----------



## SBS (24. Sep 2006)

jap, besten Dank


----------



## bertram (18. Okt 2006)

Guten Tag,

ich habe das gleiche Problem wie SBS, nur das ich NetBeans benutze.
Wie stelle ich das unter NetBeans ein?

Schon einmal vielen Dank im voraus.

MfG

bertram


----------



## njoerd (18. Okt 2006)

Netbeans:
das eigene project->rechte Maustaste->properties->Run-> VM Options


----------



## bertram (18. Okt 2006)

Danke, jetzt funktioniert es.


----------



## bertram (19. Okt 2006)

Ich habe den Speicher jetzt auf 500 MB gesetzt.
Aber ich habe jetzt 2 neue Probleme:
1.
Läuft der HeapSpace trotz 500 MB voll.
Kann ich den HeapSpace aus meinem Programm heraus leeren?

2.
Wenn ich mit NetBeans eine jar File erstelle und diese dann Starte, übernimmt die JVM nicht die 500 MB für den HeapSpace sondern setzt ihn wieder auf Standart.
Kann ich aus dem Programm heraus den HeapSpace festlegen?

Schon einmal vielen Dank im voarus.

MfG

bertram


----------



## André Uhres (19. Okt 2006)

1. Du kannst den HeapSpace aus deinem Programm heraus leeren mit:
- "System.gc();" (ohne Garantie)
- Dynamischen Neustart (Punkt 2)

2. Du kannst aus dem Programm heraus den HeapSpace festlegen mit:

```
String userdir = System.getProperty("user.dir");
String cmd = "java -Xmx500m -jar \""+userdir+"\\MeineAnwendung.jar\"";
Runtime.getRuntime().exec(cmd);
System.exit(0);
```


----------



## bertram (20. Okt 2006)

Danke es klappt jetzt.

Ich habe einen Ressourcen fressenden Quellcode, darum stell ich ihn mal hier rein, vll. hat ja jemand einen Vorschlag, wir ich ihn ändern kann, damit mein Programm nicht so viele Ressourcen benötigt.

Programmstart:


```
try
        {
            System.out.println("* Verbindung aufbauen");
            String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname;
            conn = DriverManager.getConnection(url, user, pw);
            
            System.out.println("* Statement beginnen");
            Statement stmt = conn.createStatement();
            
            
            System.out.println("* Abfrage beginnen");
            String sqlCommand1 = "SELECT * FROM zeichnungsnummernstamm";

            ResultSet rs = stmt.executeQuery(sqlCommand1);
            
            while(rs.next())
            {
                String ZeichNr = rs.getString("ZeichNr");
                String Bezeichnung = rs.getString("Bezeichnung");
                String Datum = rs.getString("Datum");
                String Angebotsnr = rs.getString("Angebotsnr");
                String Firma = rs.getString("Firma");
                String Notizen = rs.getString("Notizen");
                String IDNr = rs.getString("IDNr");
                Integer Staffelmenge1 = rs.getInt("Staffelmenge1");
                String Staffelpreis1 = rs.getString("Staffelpreis1");
                Integer Staffelmenge2 = rs.getInt("Staffelmenge2");
                String Staffelpreis2 = rs.getString("Staffelpreis2");
                Integer Staffelmenge3 = rs.getInt("Staffelmenge3");
                String Staffelpreis3 = rs.getString("Staffelpreis3");
                Integer Staffelmenge4 = rs.getInt("Staffelmenge4");
                String Staffelpreis4 = rs.getString("Staffelpreis4");
                Integer Staffelmenge5 = rs.getInt("Staffelmenge5");
                String Staffelpreis5 = rs.getString("Staffelpreis5");
                Integer Staffelmenge6 = rs.getInt("Staffelmenge6");
                String Staffelpreis6 = rs.getString("Staffelpreis6");
                Integer Staffelmenge7 = rs.getInt("Staffelmenge7");
                String Staffelpreis7 = rs.getString("Staffelpreis7");
                Integer Staffelmenge8 = rs.getInt("Staffelmenge8");
                String Staffelpreis8 = rs.getString("Staffelpreis8");
                choice1.add(ZeichNr);
                String t=choice1.getSelectedItem();

                if(t.equals(ZeichNr))
                {
                    textField1.setText(ZeichNr);
                    textField2.setText(Bezeichnung);
                    textField20.setText(Angebotsnr);
                    textField3.setText(IDNr);
                    textField4.setText(Staffelmenge1+"");
                    textField5.setText(Staffelmenge2+"");
                    textField6.setText(Staffelmenge3+"");
                    textField7.setText(Staffelmenge4+"");
                    textField8.setText(Staffelmenge5+"");
                    textField9.setText(Staffelmenge6+"");
                    textField10.setText(Staffelmenge7+"");
                    textField11.setText(Staffelmenge8+"");
                    textField12.setText(Staffelpreis1+"");
                    textField13.setText(Staffelpreis2+"");
                    textField14.setText(Staffelpreis3+"");
                    textField15.setText(Staffelpreis4+"");
                    textField16.setText(Staffelpreis5+"");
                    textField17.setText(Staffelpreis6+"");
                    textField18.setText(Staffelpreis7+"");
                    textField19.setText(Staffelpreis8+"");
                    textField21.setText(Firma);
                    textField22.setText(Datum);
                }
            }
            System.gc();
        }
        catch(Exception sqle)
        {
            System.out.println("SQLException: " + sqle.getMessage());
            sqle.printStackTrace(); 
        }
    }
```

Hier der Quellcode von dem Button, bei dem der Heap Size voll läuft:


```
try
        {
            int t=choice1.getSelectedIndex();
            t++;
            String x=choice1.getItem(t);
            textField1.setText(x);
            choice1.select(x);
            Statement stmt = conn.createStatement();
            String sqlCommand = "SELECT * FROM zeichnungsnummernstamm";
            
            ResultSet rs = stmt.executeQuery(sqlCommand);
            
            while(rs.next())
            {
                String ZeichNr = rs.getString("ZeichNr");
                String Bezeichnung = rs.getString("Bezeichnung");
                String Datum = rs.getString("Datum");
                String Angebotsnr = rs.getString("Angebotsnr");
                String Firma = rs.getString("Firma");
                String Notizen = rs.getString("Notizen");
                String IDNr = rs.getString("IDNr");
                int Staffelmenge1 = rs.getInt("Staffelmenge1");
                String Staffelpreis1 = rs.getString("Staffelpreis1");
                int Staffelmenge2 = rs.getInt("Staffelmenge2");
                String Staffelpreis2 = rs.getString("Staffelpreis2");
                int Staffelmenge3 = rs.getInt("Staffelmenge3");
                String Staffelpreis3 = rs.getString("Staffelpreis3");
                int Staffelmenge4 = rs.getInt("Staffelmenge4");
                String Staffelpreis4 = rs.getString("Staffelpreis4");
                int Staffelmenge5 = rs.getInt("Staffelmenge5");
                String Staffelpreis5 = rs.getString("Staffelpreis5");
                int Staffelmenge6 = rs.getInt("Staffelmenge6");
                String Staffelpreis6 = rs.getString("Staffelpreis6");
                int Staffelmenge7 = rs.getInt("Staffelmenge7");
                String Staffelpreis7 = rs.getString("Staffelpreis7");
                int Staffelmenge8 = rs.getInt("Staffelmenge8");
                String Staffelpreis8 = rs.getString("Staffelpreis8");
                if(x.equals(ZeichNr))
                {
                    textField2.setText(Bezeichnung);
                    textField20.setText(Angebotsnr);
                    textField3.setText(IDNr);
                    textField4.setText(Staffelmenge1+"");
                    textField5.setText(Staffelmenge2+"");
                    textField6.setText(Staffelmenge3+"");
                    textField7.setText(Staffelmenge4+"");
                    textField8.setText(Staffelmenge5+"");
                    textField9.setText(Staffelmenge6+"");
                    textField10.setText(Staffelmenge7+"");
                    textField11.setText(Staffelmenge8+"");
                    textField12.setText(Staffelpreis1+"");
                    textField13.setText(Staffelpreis2+"");
                    textField14.setText(Staffelpreis3+"");
                    textField15.setText(Staffelpreis4+"");
                    textField16.setText(Staffelpreis5+"");
                    textField17.setText(Staffelpreis6+"");
                    textField18.setText(Staffelpreis7+"");
                    textField19.setText(Staffelpreis8+"");
                    textField21.setText(Firma);
                    textField22.setText(Datum);
                }
            }
        }
        catch(Exception sqle)
        {
            System.out.println("SQLException: " + sqle.getMessage());
            sqle.printStackTrace();
        }
```

Ich weiss das in diesem Quellcode einiges doppelt geladen wird, nur weiss nicht wie ich es sonst lösen könnte.
Würde mich sehr über Verbesserungsvorschläge freuen.
Schon einmal vielen Dank im voraus.

MfG

bertram


----------



## André Uhres (20. Okt 2006)

Du kannst schonmal nach den while-Schleifen jeweils ResultSet und Statement schliessen:

```
rs.close();
stmt.close();
```


----------



## foobar (20. Okt 2006)

Oh je, da ist aber einiges Durcheinander. Hier mal ein paar Tips:

- Du solltest auf jeden Fall den DB-Code von der GUI trennen, sonst machst du dir das Leben unnötig schwer. Guck dir hierzu mal das MVC-Prinzip und das DAO-Pattern an.

- Das Hauptproblem ist aber deine Query. Du holst dir erst alle Datensätze obwohl dich eigentlich nur einer interessiert. Deine Query sollte besser so aussehen:


```
SELECT * FROM zeichnungsnummernstamm WHERE ZeichNr = x
```
Dann sparst du dir auch die While-Schleife und die If-Abfrage.

- System.gc aufrufen hat wenig Sinn.

- Wenn du einen OutOfMemory bekommst hast du in den meisten Fällen irgendeinen Fehler in deinem Code, da macht es keinen Sinn den Heap zu vergrößern.


----------



## bertram (20. Okt 2006)

Danke, es klappt jetzt einwandfrei.


----------



## Cole (18. Jan 2007)

André Uhres hat gesagt.:
			
		

> 1. Du kannst den HeapSpace aus deinem Programm heraus leeren mit:
> - "System.gc();" (ohne Garantie)
> - Dynamischen Neustart (Punkt 2)
> 
> ...



Hab da auch noch ne Frage dazu:
Den Heap Space in Eclipse über die VM Paramters hab ich erhöht, das hat supoer geklappt. Nur wenn ich das Programm mal exportieren will, hat es ja nichts mehr mit Eclpise zu tun.
Daher wollte ich es so wie du beschrieben hast in den Code schreiben (in die main, das war doch richtig oder).
Aber das Programm beendet sich imer gleich wieder, was ja an dem System.exit liegt.
Und andere Frage: Was trag ich in bei Syste.getProperty ein bei "user.dir"? 
Mfg


----------



## André Uhres (18. Jan 2007)

"user.dir" kannst du buchstäblich so stehen lassen.
Nachdem das Startprogramm die Anwendung gestartet hat, hat es ja seinen Zweck erfüllt 
und beendet sich daher logischerweise selbst.


----------



## Cole (18. Jan 2007)

Ja, ok.
Aber bei mir beendet sich das Hauptprogramm, also das mit dem ich arbeiten will!

Hab das ganze so implementiert:

```
public static void main(String[] args) {
		String userdir = System.getProperty("user.dir");
		String cmd = "java -Xms200m -Xmx200m -jar \""+userdir+"\\Dreher.jar\"";
		try {
			Runtime.getRuntime().exec(cmd);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
		
		}
		System.exit(0);
		Gui gui = new Gui();
		
		gui.getJFrame();
	}
```

Aber dann startet das Prpgramm gar nicht, wenn ich Syste.exit(0) auskommentiert, startet zwar das Programm, aber nicht einmal sondern gleich 15 mal!!
Hilfe, bitte!


----------



## André Uhres (18. Jan 2007)

Das gibt's doch net. Mach doch mal ein KSKB.
<-- siehe dazu "Lies mich" hier links nebendran.


----------



## Cole (18. Jan 2007)

Ok.
Main Klasse:

```
import java.io.IOException;


public class Main extends Gui {

		
	public static void main(String[] args) {
		String userdir = System.getProperty("user.dir");
		String cmd = "java -Xms200m -Xmx200m -jar \""+userdir+"\\Dreher.jar\"";
		try {
			Runtime.getRuntime().exec(cmd);
			System.out.println("FF");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("HH");
		}
		System.exit(0);
		Gui gui = new Gui();
		
		gui.getJFrame();
	}

}
```

Klasse Gui

```
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import java.awt.Dimension;
import javax.swing.JMenuBar;
import java.awt.event.InputEvent;
import javax.swing.JMenu;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;

import javax.swing.JButton;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import java.awt.Rectangle;



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(this);  //  @jve:decl-index=0:
	ZweitesBild bild2 ;
	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;
	private JButton jButton180 = null;
	/**
	 * This method initializes jFrame	
	 * 	
	 * @return javax.swing.JFrame	
	 */
	public JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setTitle("Bilddreher V 1.0");
			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jFrame.setBounds(new Rectangle(0, 0, 780, 530));
			
			Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
			jFrame.setLocation((screen.width-jFrame.getSize().width)/2,(screen.height-jFrame.getSize().height)/2);

			jFrame.setJMenuBar(getJJMenuBar1());
			jFrame.setContentPane(getJPanel());

			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));
			ereignisse.SpeichernDialog(speichernUnter);
			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);
			jPanel1.add(getJButton180(), 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;
	}
	private JButton getJButton180() {
		if (jButton180 == null) {
			jButton180 = new JButton();
			jButton180.setText("180°");
			ereignisse.drehung180(jButton180);
		}
		return jButton180;
	}
	/**
	 * This method initializes jPanel2	
	 * 	
	 * @return javax.swing.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);
			bild2 = new ZweitesBild();
			bilder.add(bild2);
			jPanel2.add(bilder);

		}
		return jPanel2;
	}
    public ZweitesBild getZweitesBild() {
        return bild2;
    } 
	/**
	 * 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;
	}
	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	


}
```

Klasse Ereignisshandling

```
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.image.BufferedImage;
import java.io.File;
import java.io.IOException;


import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.filechooser.FileFilter;

public class Ereignishandling extends JComponent{
	/**
	 * 
	 */
	private static final long serialVersionUID = -878263303322780253L;
	
	JFileChooser fileChooser = new JFileChooser();
	Image verkleinertesThumbnail ;
	Image zudrehendesOriginalBild;
	Image tempZuDrehendesBild = null;
	Image tempThumbnail = null;
    BufferedImage bufferedImage;
    File originalBild = null;

    int originalBreite;
    int originalHoehe;

	private Gui gui;
    public Ereignishandling(Gui gui){
        this.gui = gui;
    }
	
	  public void setImage( File uebergebenesOriginalBild )
	  {
		zudrehendesOriginalBild = Toolkit.getDefaultToolkit().getImage(uebergebenesOriginalBild.getAbsolutePath());
	    verkleinertesThumbnail = Toolkit.getDefaultToolkit().getImage( uebergebenesOriginalBild.getAbsolutePath() ).getScaledInstance(300, -1, Image.SCALE_SMOOTH);
	   
	    if ( verkleinertesThumbnail != null ){
	    repaint();
	    }
	  } 
	  @Override
	  protected void paintComponent( Graphics g )
	  {
	    if ( verkleinertesThumbnail != null )

	      g.drawImage( verkleinertesThumbnail, 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" )
				           ;
				      }
				      @Override
				      public String getDescription()
				      {
				        return "*.jpg;";
				      }
				    } );
				switch (fileChooser.showOpenDialog(null)) {
				case JFileChooser.APPROVE_OPTION:
					gui.getZweitesBild().setImage(null);
					originalBild = fileChooser.getSelectedFile();
				    			    
				    ImageIcon icon = new ImageIcon(originalBild.getAbsolutePath());
//				    originalBreite = icon.getIconWidth();
//				    originalHoehe = icon.getIconHeight();
				    				    
				    setImage(originalBild);
					break;
				case JFileChooser.CANCEL_OPTION:

					break;

				}
			}
		});

	}
	
	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" )
				           ;
				      }
				      @Override
				      public String getDescription()
				      {
				        return "*.jpg;";
				      }
				    } );
				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;

			}

			}
		});
		
	}
	
	public void drehung90Links(JButton jButtonDrehung90Links) {

		jButtonDrehung90Links.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				dreheBildlinks(zudrehendesOriginalBild, verkleinertesThumbnail);
			}
		});
	}
	
	public void drehung90rechts(JButton jButtonDrehung90Rechts) {

		jButtonDrehung90Rechts.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				dreheBildrechts(zudrehendesOriginalBild, verkleinertesThumbnail);
			
			}
		});

	}
	public void drehung180(JButton jButton180) {
		jButton180.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0){
				dreheBild180(zudrehendesOriginalBild, verkleinertesThumbnail);
			}
		});
		
	}


	protected Image dreheBildrechts(Image zudrehendesOriginalBild, Image verkleinertesThumbnail) {
		if ((zudrehendesOriginalBild == null)|| (verkleinertesThumbnail == null)) {
			JOptionPane.showMessageDialog(this,"Zuerst eine Bilddatei auswählen!", "Fehler",JOptionPane.INFORMATION_MESSAGE, null);
			return null;
			
		} else {
		
        tempZuDrehendesBild = createImage(zudrehendesOriginalBild.getHeight(null), zudrehendesOriginalBild.getWidth(null));
        Graphics2D g = (Graphics2D) tempZuDrehendesBild.getGraphics();
        g.rotate((Math.PI / 2), 0, 0);
        g.drawImage(zudrehendesOriginalBild, 0, -zudrehendesOriginalBild.getHeight(null), null);
        gui.getZweitesBild().setImage(verkleinertesThumbnail);
        bufferedImage = (BufferedImage) tempZuDrehendesBild;
        
        tempThumbnail = createImage(verkleinertesThumbnail.getHeight(null), verkleinertesThumbnail.getWidth(null));
        Graphics2D g2 = (Graphics2D) tempThumbnail.getGraphics();
        g2.rotate((Math.PI / 2), 0, 0);
        g2.drawImage(verkleinertesThumbnail, 0, -verkleinertesThumbnail.getHeight(null), null);
        gui.getZweitesBild().setImage(tempThumbnail);
        return tempZuDrehendesBild;
		}		
}
	protected Image dreheBildlinks(Image zudrehendesOriginalBild, Image verkleinertesThumbnail) {
		if ((zudrehendesOriginalBild == null)|| (verkleinertesThumbnail == null)) {
			JOptionPane.showMessageDialog(this,"Zuerst eine Bilddatei auswählen!", "Fehler",JOptionPane.INFORMATION_MESSAGE, null);
			return null;
			
		} else {
			
	tempZuDrehendesBild = createImage(zudrehendesOriginalBild.getHeight(null), zudrehendesOriginalBild.getWidth(null));
	Graphics2D g = (Graphics2D) tempZuDrehendesBild.getGraphics();
	g.rotate((Math.PI*1.5),(tempZuDrehendesBild.getHeight(null)),0 );
	g.drawImage(zudrehendesOriginalBild, 0, -zudrehendesOriginalBild.getWidth(null), null);
	gui.getZweitesBild().setImage(tempZuDrehendesBild);
	bufferedImage = (BufferedImage) tempZuDrehendesBild;
	
	tempThumbnail = createImage(verkleinertesThumbnail.getHeight(null), verkleinertesThumbnail.getWidth(null));
	Graphics2D g2 = (Graphics2D) tempThumbnail.getGraphics();
	g2.rotate((Math.PI*1.5),(tempThumbnail.getHeight(null)),0 );
	g2.drawImage(verkleinertesThumbnail, 0, -verkleinertesThumbnail.getWidth(null), null);
	gui.getZweitesBild().setImage(tempThumbnail);
	
	return tempZuDrehendesBild;
		}		
	}
     		

	protected Image dreheBild180(Image zudrehendesOriginalBild, Image verkleinertesThumbnail) {
		if ((zudrehendesOriginalBild == null)|| (verkleinertesThumbnail == null)) {
			JOptionPane.showMessageDialog(this,"Zuerst eine Bilddatei auswählen!", "Fehler",JOptionPane.INFORMATION_MESSAGE, null);
			return null;
			
		} else {
			
		tempZuDrehendesBild = createImage(zudrehendesOriginalBild.getWidth(null), zudrehendesOriginalBild.getHeight(null));
        Graphics2D g = (Graphics2D) tempZuDrehendesBild.getGraphics();
        g.rotate((Math.PI),(tempZuDrehendesBild.getWidth(null)/2),0 );
        g.drawImage(zudrehendesOriginalBild, 0, -zudrehendesOriginalBild.getHeight(null), null);
        gui.getZweitesBild().setImage(tempZuDrehendesBild);
        bufferedImage = (BufferedImage) tempZuDrehendesBild;
        
        tempThumbnail = createImage(verkleinertesThumbnail.getWidth(null), verkleinertesThumbnail.getHeight(null));
        Graphics2D g2 = (Graphics2D) tempThumbnail.getGraphics();
        g2.rotate((Math.PI),(tempThumbnail.getWidth(null)/2),0 );
        g2.drawImage(verkleinertesThumbnail, 0, -verkleinertesThumbnail.getHeight(null), null);
        gui.getZweitesBild().setImage(tempThumbnail);
        
        return tempZuDrehendesBild;
		}
	}



	
}
```


KLasse ZweitesBild

```
import java.awt.Graphics;

import java.awt.Image;
import java.awt.image.RenderedImage;

import javax.swing.JPanel;


public class ZweitesBild extends JPanel{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private Image image2;
	RenderedImage image3 ;
    public void setImage( Image img) {
        image2 = img;
        repaint();
    }
    
    public void paintComponent(Graphics g){
        super.paintComponent(g);

        if ( image2 != null ){
            g.drawImage( image2, 10, 0, this );
            image3 = (RenderedImage) image2;
        }
    } 

}
```


Ich denk mal das dürfte dir bekannt vorkommen


----------



## André Uhres (19. Jan 2007)

Die "Main" Klasse änderst du so um:

```
public class Main {
    public static void main(String[] args) {
        Gui gui = new Gui();
        gui.getJFrame();
    }
}
```
Du machst dir eine neue Anwendung "DreherStart.jar" mit nur dieser Klasse:

```
import java.io.IOException;
public class Main {
    public static void main(String[] args) {
        String userdir = System.getProperty("user.dir");
        String cmd = "java -Xms200m -Xmx200m -jar \""+userdir+"\\lib\\Dreher.jar\"";
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {}
        System.exit(0);
    }
}
```
Das Distribution Verzeichnis sollte so aussehen:

```
dist
     DreherStart.jar
     lib
          Dreher.jar
```
Gestartet wird mit "DreherStart.jar". "Dreher.jar" ist im Unterverzeichnis "lib".


----------



## Cole (23. Jan 2007)

Danke erstmal für deine Antwort, und sorry, dass ich erst jetzt dazu komme zu posten, war ein paar Tage vereist.
Die DreherStart.jar hab ich erstellt.

[edit]: Blödsinn verzapft.
Es läuft jetzt so wie will  Vielen Dank an dich!!!!


----------

