Andere Klasse mit ActionEvent aufrufen, aber wie?

Status
Nicht offen für weitere Antworten.

Slive

Mitglied
Hallo miene Herren/Damen,

ich bin noch ein totaler Noob was Java angeht. Ihr könnt mir sicher bei mienem Problemchen helfen :lol:.
Das GUI steht bereits. Nun will ich die Klasse "Screenschot.java" mittels Menubar "Speichern" aufrufen.

Screenshot.java:
Code:
import com.sun.image.codec.jpeg.JPEGCodec;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
public class Screenshot
{
  public static void main( String[] args ) throws Exception
  {
    Thread.sleep( 2000 );
    BufferedImage bi = new Robot().createScreenCapture(
      new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
    OutputStream  out  = new FileOutputStream( "c:/screenshot.jpg" );
    JPEGCodec.createJPEGEncoder( out ).encode( bi );
    out.close();
    ImageIO.write( bi, "jpg", new File("screenshot.jpg") );
    System.exit( 0 );
  }
}

Meine Mainklasse (GUI) hat diesen Eintrag:
Code:
     extras.add(new AbstractAction("Speichern")
      { 
      public void actionPerformed(ActionEvent e) 
      {
     //Befehl??????????????
       
      } 
});

Fragen:

-Wie "entMaine" ich die Klasse Screenshot.java?
-Wie schaffe ich eine Verbindung?[/quote]

Danke

Mfg
Slive
 
Hallo nocxsville,

danke für deine schnelle Antwort. Ich bin mitlerweile so weit, dass die Klasse Screenshot.java fehlerfrei da steht.
Code:
import com.sun.image.codec.jpeg.JPEGCodec;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

public class Screenshot {
	
	    Thread.sleep( 2000 );
	    BufferedImage bi = new Robot().createScreenCapture(
	     new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
	    OutputStream  out  = new FileOutputStream( "c:/screenshot.jpg" );
	    JPEGCodec.createJPEGEncoder( out ).encode( bi );
	    out.close();
	    ImageIO.write( bi, "jpg", new File("screenshot.jpg") );
	    System.exit( 0 );
}

Diese macht einen Screenshot vom Bildschirm und speichert das Bild dann auf c:\ ab.
Ich will, dass das mein Programm einen Screenshot macht, wenn ich auf "Speichern" drücke.
In meiner Main sieht es so aus:
Code:
//MenuBar
      JMenuBar menuBar = new JMenuBar();
      setJMenuBar(menuBar);
      
      JMenu datei = new JMenu("Datei");
      menuBar.add(datei);
      JMenu extras = new JMenu("Extras");
      menuBar.add(extras);
      
      datei.add(new AbstractAction("Neu")
      { 
      public void actionPerformed(ActionEvent e) 
      {
      mc.reset();
      numPoints.setText("  0 Punkte ");
      } 
 });

      extras.add(new AbstractAction("Speichern")
      { 
      public void actionPerformed(ActionEvent e) 
      {
    	  //<<--- Was kommt hier den rein??????
         // Sowas wie "Führe jetzt bitte die Klasse Screenshot.java aus!"

       
      } 
});

Wie gesagt, bin noob 🙂. Freu mich schon, wenns funktioniert!!

Mfg
Slive
 
Die Klasse Screenshot hat noch mehrere Fehler.
Zunächst mal muss der Aufruf von Thread.sleep(2000); in einen try-catch-Block.
Und damit die Klasse auch noch ausgeführt werden kann, sollte dein Code sinnvoll in Methoden aufgeteilt werden. Eine Lösung dafür wäre z.B. den Defaultkonstruktor zu überschreiben, den Code also in eine Konstruktormethode zu setzen.
Und erst dann kannst du in deiner actionPerformed()-Methode ein Objekt der Klasse Screenshot erzeugen und das Bild speichern.
Und damit nicht alles gleich beendet wird, muss der Aufruf System.exit(0); weg.
 
das im Screenshot muss in eine Methode rein..
so nackt geht das nicht..

zb
public static void takeScreenshot(){
}

das System.exit muss weg = beenden

was kommt dort rein?

Screenshot.takeScrenshot();

so in etwa ;-)
 
Deine Klasse Screenshot ist so aber nciht fehlerfei 😉 . Wenn du deine Klasse weiterhin einfach so ausführbar machen möchtest, pack das Ganze wieder in die Main-Methode und schreib dann in deine actionPerformed

Code:
Screenshot.main(null);

Alternativ kannst du deinen code in der Screenshot Klasse einfach in eine nicht statische Methode auslagern, dir ein neues Objekt der Klasse Screenshot erzeugen und dann die von dir definierte Methode aufrufen.

[edit] Hui, da war ich aber langsam ... 😳
 
Hallo ich bins wieder.

So funktionirt das ganze schonmal:
Code:
import com.sun.image.codec.jpeg.JPEGCodec;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

public class Screenshot
{
  public static void main( String[] args ) throws Exception
  {
    Thread.sleep( 2000 );
    BufferedImage bi = new Robot().createScreenCapture(
    new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
    OutputStream  out  = new FileOutputStream( "D:/screenshot.jpg" );
    JPEGCodec.createJPEGEncoder( out ).encode( bi );
    out.close();
    ImageIO.write( bi, "jpg", new File("screenshot.jpg") );
    
  } 
}
Code:
 extras.add(new AbstractAction("Speichern")
      { 
      public void actionPerformed(ActionEvent e) 
      {
    	  try {
			Screenshot.main(null);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
      } 
});

Finde ich aber nicht sehr elegant 🙂. Danke für den Tip Hobbit_Im_Blutrausch!

Ich würde es aber lieber so realisieren, wie es unser Gast im fünten Post vorgeschlagen hat. Funktoniert aber nicht 🙁.

Code:
import com.sun.image.codec.jpeg.JPEGCodec;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

public class Screenshot
{
	public static void takeScreenshot(){ 
  
    Thread.sleep( 2000 );
    BufferedImage bi = new Robot().createScreenCapture(
    new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
    OutputStream  out  = new FileOutputStream( "D:/screenshot.jpg" );
    JPEGCodec.createJPEGEncoder( out ).encode( bi );
    out.close();
    ImageIO.write( bi, "jpg", new File("screenshot.jpg") );
    
  } 
}

Da ist alles ab "public static void takeScreenshot(){" rot 🙁.
Habe ich ne Klammer vergessen?

Danke

mfg
Slive
 
Ne, aber du fängst ne Exception nicht. Thread.sleep wirft uU. eine InterruptedException und Robot#createScreenCapture eine AWT-Exception.
 
Hallo Hobbit_Im_Blutrausch,

danke, aber ich verstehe lieder kein Wort 😳.
Hast du villeicht "Code" für mich?

"Ich brauche mehr Input"! :wink:

Grüße
Slive
 
Code:
public class Screenshot
{
   public static void takeScreenshot(){
 
try {
    Thread.sleep( 2000 );
    BufferedImage bi = new Robot().createScreenCapture(
    new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
    OutputStream  out  = new FileOutputStream( "D:/screenshot.jpg" );
    JPEGCodec.createJPEGEncoder( out ).encode( bi );
    out.close();
    ImageIO.write( bi, "jpg", new File("screenshot.jpg") );
   }
catch (InterruptedException e) {
    e.printStackTrace();
}
catch (IOException e) {
   e.printStackTrace();
}
catch (AWTException e) {
   e.printStackTrace();
}
  }
}
 
Hobbit_Im_Blutrausch du bist mein persönlicher Held! :wink: Funktioniert wunderbar!

Code:
import com.sun.image.codec.jpeg.JPEGCodec;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

public class Screenshot
{
   public static void takeScreenshot(){

try {
    Thread.sleep( 2000 );
    BufferedImage bi = new Robot().createScreenCapture(
    new Rectangle(800, 600) );
    OutputStream  out  = new FileOutputStream( "D:/Users/Frank-D/Eigene Dateien/workspace/Delaunay/screenshot.jpg" );
    JPEGCodec.createJPEGEncoder( out ).encode( bi );
    out.close();
    ImageIO.write( bi, "jpg", new File("screenshot.jpg") );
   }
catch (InterruptedException e) {
    e.printStackTrace();
}
catch (IOException e) {
   e.printStackTrace();
}
catch (AWTException e) {
   e.printStackTrace();
}
  }
}
Wenn du mir noch zeigen könntest, wie ich "Rectangle(800, 600)" auch an eine bestimmte Location bringen kann und wie ich die Komprimiereungrate des Bildes beeinflussen kann, dann ..... wäre mein Tag wirklich geretet!

Grüße
Slive 😀
 
Du kannst bei Rectangle auch noch eine Position angeben und nicht nur eine Größe 😉 . Speicher es doch einfach als png. Da haste verlustfreie kompression und manchmal ist die sogar besser als die von jpg. BTW brauchst du so oder so den JPEGCodec bzw. JPEGEncoder nicht.
 
Jeha!! Mit euch mach Java ja richtig Spass!! 😀

Ich werde mich jetzt mal mit
Code:
Toolkit.getDefaultToolkit().getScreenSize()
beschäftigen und schauen ob ich mein Frame automatisch in die Bildschirmmitte setzten kann. Und somit auf jedem Dektop ein Screeny an der richtigen Location machen kann.

Bis Bald 🙂

Grüße
Slive
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben