JFrame mit mehreren Ebenen
Ich habe ein Fenster, das hat zwei Ebenen: einem statischen hintergrund und einem Vordergrund, der enthält sich bewegende Objekte. Meine Idee ist, zeichnen Sie den hintergrund nur einmal (weil es nicht zu ändern), so dass ich die wechselnden panel transparent und fügen Sie es auf der Oberseite der statischen hintergrund. Hier ist der code für diese:
public static void main(String[] args) {
JPanel changingPanel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(100, 100, 100, 100);
}
};
changingPanel.setOpaque(false);
JPanel staticPanel = new JPanel();
staticPanel.setBackground(Color.BLUE);
staticPanel.setLayout(new BorderLayout());
staticPanel.add(changingPanel);
JFrame frame = new JFrame();
frame.add(staticPanel);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
Dieses Stück code gibt mir die richtige Bild, das ich will, aber jedes mal, wenn ich repaint changingPanel
, staticPanel
wird neu gestrichen (die offensichtlich gegen die ganze Idee der Malerei der statischen panel nur einmal). Kann jemand mir zeigen, was falsch ist?
Zur info ich bin mit dem javax.swing.Timer neu berechnen und aktualisieren die wechselnden panel-24 mal pro Sekunde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie repaint eine transparente Komponente über die anderen, Sie immer noch 'dreckig' die untere Komponente, so dass es die neu lackiert werden. Wenn du nicht neu streichen Sie die untere Schicht, die Sie erhalten würden, ein Smear-Effekt von dem Bild oben drauf.
Nur die Optimierung verfügbar hier ist nicht die Regeneration des Bildes, das auf der unteren Ebene. Das raster muss noch lackiert werden, um die Grafik-Puffer jedes mal, wenn die Schicht oben genannten änderungen.
Dies ist genau die Art, wie die Malerei funktioniert. Swing hat, um die Suche für die erste Komponente mit einem nicht-opaken hintergrund. Dann sind es Malt, die Komponente und die Kinder um sicherzustellen, dass alle Malerei ausgeführt ist.
Selbst wenn Sie einen Umzug compnent, SWing würde noch brauchen, um "löschen" die Letzte position der compnent, was bedeutet, es hat zu mindestens repaint Bereich der hintergrund-panel, vor dem repaint der Komponente, die verschoben.
Machen die Malerei effizienter werden die Kindes-panel sollte undurchsichtig sein. Ich weiß nicht, warum Sie die Standardeinstellung geändert.
Ein wirklich einfacher Weg ist die Verwendung jxlayer. Implementieren AbstractLayerUI und fügen hinzu, dass über die Komponente. Sehen hier, um loszulegen.