Ich arbeite gerade an meinen Swing Framework und schreibe gerade eine Action, die einen Screenshot des Fensters erstellt und dieses dann speichert. Nur wenn ich das Menü Item anklicke dass die Action ausloest, dann ist im Foto immer eben dieses Menü drauf, was eig nicht sein sollte. Habt ihr ne Idee wie ich das verhindern kann? Habe ein Thread.sleep(200) benutzt, ist aber meiner Meinung nach verdammt unsauber…
package de.framework.actions;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.SwingWorker;
import de.framework.Application;
import de.framework.BasicApplicationAction;
@SuppressWarnings("serial")
class SnapshotAction extends BasicApplicationAction {
// TODO: Use i18n!
public SnapshotAction(Application application) {
super("Create snapshot...", application);
}
@Override
public void actionPerformed(ActionEvent e) {
new SnapshotWorker().execute();
}
private class SnapshotWorker extends SwingWorker<BufferedImage, Object> {
@Override
protected BufferedImage doInBackground() throws Exception {
// TODO: Find another cleaner way...
Thread.sleep(200);
JFrame frame = getApplication().getView().getMainFrame();
Robot robot = new Robot();
return robot.createScreenCapture(frame.getBounds());
}
@Override
protected void done() {
try {
BufferedImage image = get();
if (image != null) {
File save = getSavingFile();
if (save != null) {
// TODO: Let the user/dev choose
ImageIO.write(image, "png", save);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
private File getSavingFile() {
JFileChooser fc = new JFileChooser();
int retVal = fc.showSaveDialog(null);
if (retVal == JFileChooser.APPROVE_OPTION) {
return fc.getSelectedFile();
}
return null;
}
}