java.lang.OutOfMemoryError: Java

Status
Nicht offen für weitere Antworten.

SBS

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

Top Contributor
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

Aktives Mitglied
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?
 

SBS

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

Top Contributor
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.
 

bertram

Mitglied
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
 

bertram

Mitglied
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

Top Contributor
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:
Code:
String userdir = System.getProperty("user.dir");
String cmd = "java -Xmx500m -jar \""+userdir+"\\MeineAnwendung.jar\"";
Runtime.getRuntime().exec(cmd);
System.exit(0);
 

bertram

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

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

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

Top Contributor
Du kannst schonmal nach den while-Schleifen jeweils ResultSet und Statement schliessen:
Code:
rs.close();
stmt.close();
 

foobar

Top Contributor
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:

Code:
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.
 

Cole

Bekanntes Mitglied
André Uhres hat gesagt.:
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:
Code:
String userdir = System.getProperty("user.dir");
String cmd = "java -Xmx500m -jar \""+userdir+"\\MeineAnwendung.jar\"";
Runtime.getRuntime().exec(cmd);
System.exit(0);

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

Top Contributor
"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

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

Hab das ganze so implementiert:
Code:
	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!
 

Cole

Bekanntes Mitglied
Ok.
Main Klasse:
Code:
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
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.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
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.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
Code:
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

Top Contributor
Die "Main" Klasse änderst du so um:
Code:
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:
Code:
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:
Code:
dist
     DreherStart.jar
     lib
          Dreher.jar
Gestartet wird mit "DreherStart.jar". "Dreher.jar" ist im Unterverzeichnis "lib".
 

Cole

Bekanntes Mitglied
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!!!!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 10
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
M java.lang.OutOfMemoryError Allgemeine Java-Themen 2
F java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 22
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
H Skalieren von Image -> java.lang.OutOfMemoryError - WARUM Allgemeine Java-Themen 18
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
F java.lang.OutOfMemoryError Allgemeine Java-Themen 13
M java.lang.OutOfMemoryError Allgemeine Java-Themen 7
F java.lang.OutOfMemoryError Allgemeine Java-Themen 17
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
H Java Mail Fehlermeldung: java.lang.NoClassDefFoundError: javax/mail/internet/AddressException Allgemeine Java-Themen 5
Crooda Compiler-Fehler java.lang.NoClassDefFoundError bitcoinj Allgemeine Java-Themen 1
I Fehler java.lang.NullPointerException Allgemeine Java-Themen 5
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
H java.lang.NullPointerException Allgemeine Java-Themen 5
L Interpreter-Fehler java.lang.NullPointerException Allgemeine Java-Themen 17
F java.lang.ClassNotFoundException: .class Allgemeine Java-Themen 5
S java.lang.NoClassDefFoundError Allgemeine Java-Themen 5
J Compiler-Fehler java.lang.StringIndexOutOfBoundsException Allgemeine Java-Themen 12
D java.lang.TypeNotPresentException Allgemeine Java-Themen 3
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S javadoc java.lang.NullPointerException Allgemeine Java-Themen 2
B Variable class in java.lang.Object Allgemeine Java-Themen 11
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
T ProcessBuilder (java.lang.NoClassDefFoundError) Allgemeine Java-Themen 2
T java.lang.AssertionError: Allgemeine Java-Themen 4
T java.lang.ClassCastException: Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
B java.lang.UnsupportedClassVersionError Allgemeine Java-Themen 12
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
B JNI - java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 21
E Interpreter-Fehler java.lang.ExceptionInInitializerError Allgemeine Java-Themen 12
C java.lang.ClassCastException Allgemeine Java-Themen 3
P Fehler beim Programmstart: java.lang.NoClassDefFound Allgemeine Java-Themen 12
T java.lang.ClassCastException Allgemeine Java-Themen 7
B Java - java.lang Allgemeine Java-Themen 12
sylo java.lang.NoSuchMethodError: Obwohl Methode vorhanden Allgemeine Java-Themen 8
MonsterBit java.lang.NullPointerException Allgemeine Java-Themen 2
H Applet java.lang.reflect.InvocationTargetException Allgemeine Java-Themen 9
M SerialPort RS232 : java.lang.NoSuchFieldError: eis Allgemeine Java-Themen 2
U java.lang.ClassNotFoundException: .jar Allgemeine Java-Themen 8
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
W java.lang.ClassCastException Allgemeine Java-Themen 10
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
N java.lang.InstantiationException Allgemeine Java-Themen 10
J java.lang.NullPointerException bei Threadprogrammierung Allgemeine Java-Themen 9
D replaceAll => no such java.lang.NoSuchMethodError Allgemeine Java-Themen 5
G java.lang.LinkageError: loader constraints violation. Allgemeine Java-Themen 3
O java.lang.NumberFormatException für normalen integer Allgemeine Java-Themen 4
G Javadoc generiert keine Links zu java.lang Klassen? Allgemeine Java-Themen 4
Y java.lang.UnsupportedClassVersionError: Allgemeine Java-Themen 5
G java.lang.ClassCastException Allgemeine Java-Themen 3
J Fehler: java.lang.NullPointerException Allgemeine Java-Themen 2
E java.lang.outofmemory über windows-cmd ändern Allgemeine Java-Themen 6
J Folgender Fehler: java.lang.NullPointerException Allgemeine Java-Themen 4
I java.lang.UnsatisfiedLinkError: Allgemeine Java-Themen 8
J Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 26
J java.lang.StackOverflowError Debugging? Allgemeine Java-Themen 51
D java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 5
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
S java.lang.UnsatisfiedLinkError mit JNI Allgemeine Java-Themen 6
reibi java.lang.Class - Resource - Solaris Allgemeine Java-Themen 17
S Exception in Thread "main" java.lang.NoClassDef. b Allgemeine Java-Themen 2
M java.lang.UnsupportedClassVersionError: Bad version number i Allgemeine Java-Themen 5
O "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBounds Allgemeine Java-Themen 6
B Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 12
G java.lang.NullPointerException JFreeChart Allgemeine Java-Themen 5
E Java Fehlermeldung java.lang.NoClassDefFoundError Allgemeine Java-Themen 3
G Problem mit java.lang.reflect.Field Allgemeine Java-Themen 15
P Kompilerfehler: at java.lang.ClassLoader.loadClassInternal(U Allgemeine Java-Themen 16
M java.lang.NullPointerException im Chatclient Allgemeine Java-Themen 12
H java.lang.ExceptionInInitializerError Allgemeine Java-Themen 7
D java.lang.IllegalMonitorStateException: current thread not Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 15
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
T Profifrage: java.lang.StackOverflowError bei BigInteger Allgemeine Java-Themen 27
W java.lang.ClassNotFoundException Allgemeine Java-Themen 10
B Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 5
B java.lang.NullPointerException Allgemeine Java-Themen 11
S Exception in thread "main" java.lang.StringIndexOu Allgemeine Java-Themen 9
J java.lang.ArrayIndexOutOfBoundsException Allgemeine Java-Themen 2
P Hilfe zu java.lang.Object Allgemeine Java-Themen 3
K java.lang.reflect - Getter und Setter ermitteln Allgemeine Java-Themen 8
G Java.lang.Compiler Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben