Kann nicht JFrame aktualisieren Bild
Hey, also ich arbeite an einem Programm und für debugging-Zwecke, ich versuche, das Programm um einen screenshot von einem Teil des Displays. Ich möchte die Anzeige aktualisiert, aber ich kann nicht scheinen, um es zu arbeiten. Ich bin sicher, es ist eine einfache Angelegenheit, aber meine Erfahrung mit Java-Applets ist sehr klein.
Hier ist der Teil, dass ich habe Probleme mit:
...
Thread.sleep(5000);
try {gb = new GameBoard(frame.getBounds());}
catch(Exception e){System.out.println("Error.");} //Make "gameboard" Object
while (true)
{
Thread.sleep(1000);
gb.grabImage(); //use java.awt.Robot's createScreenCapture()
ImageIcon icon = new ImageIcon(gb.image()); //wrap the image
JLabel label = new JLabel(icon, JLabel.CENTER);
frame.getContentPane().add(label,BorderLayout.EAST); //display the image (works)
//JOptionPane.showMessageDialog(null, label, "icon", -1);
label.repaint(); //update the display??
frame.repaint();
frame.getContentPane().repaint();
}
Wie gesagt, das Bild wird angezeigt, und schaffen neue, wenn ich das ändern der Applet Größe, aber ich brauche eine sich ständig verändernde Bild.
Vielen Dank im Voraus!
- Sind Sie sicher, dies ist ein applet und eine Applikation? Ich glaube default-Einstellungen verbieten die Erstellung von java.das awt.Roboter in einem applet.
- Versuchen Sie, dies zu tun...
label.revalidate(); label.repaint();
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie erstellen und hinzufügen einer neuen
JLabel
jedes mal durch die Schleife. Denn Sie verändern die Struktur der Komponente Baum müssen Sie rufenrevalidate
auf dem Rahmen der content-Bereich.Eine bessere Lösung wäre, nur ändern Sie das Bild auf einem einzigen JLabel. Erstellen Sie ein label hinzufügen, dann in der Schleife verwenden
JLabel.setIcon
undrepaint
.SwingUtilities.invokeLater
undSwingUtilities.invokeAndwait
. Swing Komponenten sind nicht thread-sicher, so dass die änderung der Komponentenstruktur oder Aufruf von setter auf Swing-Komponenten können unsicher sein, wenn man aus anderen threads.Als @RD-Noten,
createScreenCapture()
werfen wirdSecurityException
wenn das applet nicht signiert ist. Schlafen auf dem event-dispatch-thread blockieren von updates. Diese Beispiel erfasst ein Bild, wie die Maus gezogen wird; seineBufferedImage
"merkt" sich den zuletzt aufgenommenen Bild.Aus, was ich mich erinnere,
repaint()
in Java sollte wirklich genannt wordeninvalidate()
-- es nicht wirklich streichen, die Fenster; es wird nur für ungültig erklärt werden, damit er nachlackiert werden können, die von der OS bei der nächsten Gelegenheit. Ich schaue nicht gezielt auf deinen code, aber ich denke, das könnte das Problem sein. Ich bin mir nicht sicher, wie Sie Sie zu zwingen, neu zeichnen, aber eine Idee wäre aus der Funktion zurückzugeben, dann haben Sie ein timer-interrupt, die Sie und malen Sie es dann -- so, der OS wird eine chance haben, malen Sie das Fenster.repaint
kennzeichnet die Komponente als zu Lackieren;invalidate
markiert die Komponente benötigen, um das layout neu berechnet. Es ist einrepaintImmediately
Methode, wenn Sie wirklich wollen es, Sie zu streichen, gerade jetzt, aber Sie wollen nicht zu verwenden, wenn Sie absolut sicher sind, was Sie tun.invalidate
Methode in Java -- ich war aufinvalidate
wie in Windows (wieInvalidateRect()
) und die .NET Framework (wieControl.Invalidate()
), als dass bezieht sich auf die Malerei und nicht das layout. Danke für den Hinweis es aber, sorry für die confusin.