Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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 );
}
}
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!!
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.
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.
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?
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!
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.
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.