Heim > Java > javaLernprogramm > Wie kann ich die Threading-Probleme von Swing verhindern, wenn ich JTextFields und animierte Zeichnungen auf einem JPanel kombiniere?

Wie kann ich die Threading-Probleme von Swing verhindern, wenn ich JTextFields und animierte Zeichnungen auf einem JPanel kombiniere?

Linda Hamilton
Freigeben: 2024-12-31 20:54:14
Original
158 Leute haben es durchsucht

How Can I Prevent Swing's Threading Issues When Combining JTextFields and Animated Drawing on a JPanel?

JTextFields zusätzlich zum aktiven Zeichnen auf JPanel: Threading-Probleme

Angenommen, Sie möchten zusätzlich eine ordnungsgemäße, mehrfach gepufferte Rendering-Umgebung erstellen welche Swing-Benutzeroberflächenelemente hinzugefügt werden können. Dabei wird ein rotes Rechteck auf einem Hintergrund animiert, für den nicht jedes Bild aktualisiert werden muss. Stattdessen wird der Hintergrund auf einem BufferedImage gerendert und nur der Teil neu gezeichnet, der zum Löschen der vorherigen Position des Rechtecks ​​erforderlich ist.

Nach dem Hinzufügen eines JTextField zum JPanel und dem Fokussieren darauf wird jedoch die vorherige Position gelöscht des Rechtecks ​​schlägt bei jedem Blinken des Cursors fehl. Dies liegt daran, dass Swing nicht threadsicher ist und das Bild asynchron gemalt wird.

Um dieses Problem zu beheben, müssen Sie die Methode der Oberklasse aufrufen und die alte Zeichnung in der Methode paintComponent() löschen:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    int width = this.getWidth();
    int height = this.getHeight();
    g.setColor(Color.black);
    g.fillRect(0, 0, width, height);
    ...
}
Nach dem Login kopieren

Alternativ können Sie den Code vereinfachen und nach Bedarf optimieren. Beispielsweise ist die Verwendung von Einfügungen, zusätzlichen Puffern oder einem Komponenten-Listener möglicherweise nicht erforderlich.

Nachtrag:

Das Festlegen der Hintergrundfarbe im Konstruktor schließt die Notwendigkeit aus um das Panel in paintComponent() zu füllen, während super.paintComponent() dafür sorgt, dass die Textfelder korrekt funktionieren. Wie bereits erwähnt, ist diese Problemumgehung fragil. Es ist besser, den Code zu vereinfachen und nach Bedarf zu optimieren.

Nachtrag 2:

super.paintComponent() ruft die update()-Methode des UI-Delegierten auf, die die ausfüllt angegebene Komponente mit ihrer Hintergrundfarbe, wenn ihre undurchsichtige Eigenschaft wahr ist. Sie können setOpaque(false) verwenden, um dies zu verhindern.

Das obige ist der detaillierte Inhalt vonWie kann ich die Threading-Probleme von Swing verhindern, wenn ich JTextFields und animierte Zeichnungen auf einem JPanel kombiniere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage