Malerarbeiten ein JPanel innerhalb eines Rahmens
Ich habe ein JPanel innerhalb eines Rahmens. Die Inhalte der JPanel soll aktualisiert werden mit jedem Aufruf paintComponent
(das heißt durch repaint()
), aber wenn ich es tun, da unten, ich sehe nur ein weißes Fenster.
(Bitte entschuldigen Sie die entstellten Einzug, Eclipse enthält alle möglichen seltsamen Sachen mit den tabs.)
private static void handleGUI()
{
JFrame frame = new JFrame("Animation");
frame.setPreferredSize(new Dimension(100, 100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Board b = new Board();
frame.getContentPane().add(b);
frame.pack();
frame.setVisible(true);
while(true)
{
System.out.println("Repainting panel");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
b.repaint();
}
}
public class Board extends JPanel
{
public Board() { t=0; }
private int t;
public void paintComponent(Graphics g)
{
super.paintComponent(g);
++t;
/* Variables snipped */
g.setColor(Color.white);
g.drawOval(0, 0, width, height);
BufferedImage image = ImageIO.read(new File(imagePath));
g.drawImage(image, x(t), y(t));
/* There's some more image and rectangle drawing ahead */
}
}
- Tatsächlich, Eclipse enthält alle möglichen coolen Sachen mit tabs. 🙂 Einfach mit STRG-UMSCHALT-F, um formatieren Sie Ihre Quelle automatisch. Es wird produzieren eine konsistente Formatierung und Einrückung für Sie, entlastet Sie von der Last der es selbst tun.
- was sind die Werte für x(0), y(0)? Das Bild konnte nicht von Ihrem panel. Führen Sie es im debugger? Der code kann eine exception werfen, die in den GUI-thread, wenn Ihr image nicht gefunden wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie mehrere Probleme mit dem code, wurde oben erwähnt (1+ rep -- aber es sieht für mich so, als ob Sie haben den code nun in deiner paintComponent-Methode, die nicht tun, zeichnen), Ihre paintComponent-Methode ist fehlerhaft, aber nicht nur das, du hast eine while(true) - Schleife und Thread.schlafen im Swing-Haupt-thread der EDT, die Swing und Ihre ganze GUI zu schlafen. Besser einen Swing-Timer, statt. Auch Sie Stand,
Sind Sie sicher, dass Sie wollen, um Programm-Logik in der paintComponent-Methode? Dies ist in der Regel verpönt, da Sie den Programmierer nicht haben vollständige Kontrolle über, wenn diese Methode aufgerufen wird. Es kann aufgerufen werden, wenn Sie rufen repaint (aber nicht immer), und können aufgerufen werden durch Nachrichten aus dem OS, wenn Sie nicht erwarten, dass es genannt werden.
Auch, wollen Sie nie Lesen einer Datei innerhalb der paintComponent Methode wie das wird langsam Ihre Malerei zu einem cawl.
Ich würde empfehlen, diese änderungen:
1) Erstellen Sie eine Swing-Timer mit einer Periode von 1000, und in seinem ActionListener die actionPerformed-Methode, Lesen Sie in Ihrem Bild (vorzugsweise in einem hintergrund-thread, wenn das Bild hat keine signifikante Größe), und die Bild Lesen in eine Klasse Feld, sagen, genannt image.
2) In den gleichen Timer die actionPerformed-Methode, Schrittweite t.
3) Nach dem das Bild eingelesen ist, rufe repaint auf das JPanel zeichnen und die Zeichnung JPanel verwenden Sie die Bild-variable auf Farbe das Bild mit. Seien Sie vorsichtig, wenn Sie über einen hintergrund-thread zu Lesen in dem Bild, wie Sie brauchen, um in diesem thread benachrichtigt die GUI, wenn das Bild vollständig gelesen wurde, in. Wenn Sie mit einem SwingWorker, dies zu tun, können Sie ein PropertyChangeListener Listener der SwingWorker ist-Zustand-Wert und löst, wenn diese änderungen StateValue.GETAN.
Ist dies unklar oder verwirrend sind, bitten Sie um Klärung.
edit: wenn die Bilder nicht zu groß sind, möchten Sie vielleicht Lesen Sie Sie alle auf einmal, oder führen Sie eine batch-Lesen, wenn ein paar benötigt. Es gibt keine absolute Notwendigkeit zu Lesen in den Bildern, die unmittelbar vor der Verwendung.
Nicht den thread schlafen. Verwenden Sie einen Swing Timer zu setzen, aus dem repaint-events.
Ihre paintComponent ruft einfach nur super.paintComponent. Also das JPanel, während Sie malen es selbst, die Licht-Grau, oder weiß oder hellbraun oder sowas je auf Ihr Aussehen und fühlen.