Swing JButton flackert trotz DoubleBufferings

Bjoern82

Mitglied
Hallo liebe Java-Community,

leider habe ich ein Problem mit den JButtons und hoffe, dass es eine leichte Lösung gibt.

Ich habe ein animiertes Applet erstellt und arbeite mit DoubleBuffering, um Flimmern zu unterdrücken, was auch prima funktioniert. Bisher habe ich allerdings alle GUI-Elemente wie Buttons einfach "von Hand" gezeichnet und die Koordinaten abgefragt, was sehr unprofessionell ist. Deswegen wollte ich nun echte Buttons verwenden. Mit den älteren AWT Buttons hatte ich leider das Problem, dass sie stark geflimmert haben, denn AWT unterstützt anders als Swing noch kein DoubleBuffering für seine Komponenten. Somit bin ich nun auf JButtons umgestiegen und habe mit .setDoubleBuffered(true) DoubleBuffering aktiviert. Mein Problem: Auch die JButtons flimmern, trotz des aktivierten DoubeBufferings.

Kennt jemand die Ursache bzw. weiß jemand die Lösung für dieses Problem?

Schon einmal vielen Dank im Voraus!

Viele Grüße
Björn
 

Bjoern82

Mitglied
Kleines Update: Ich habe nun noch ein wenig weiter probiert, mein Problem zu lösen, leider ohne Erfolg. Ich hatte die Idee das repaint der Buttons zu unterdrücken und sie statt dessen selbst über .paint() zu malen. Die Funktion .setIgnoreRepaint(true) blieb leider wirkungslos, dafür konnte ich die Buttons mit .setOpaque(false) verschwinden lassen. Mit den Funktionen .paint(g), .update() oder .print() klappt es nun tatsächlich die Buttons zu malen und(!) sie flackern auch nicht mehr, ... nur sind sie anschließend leider immer in der linken oberen Ecke, egal welche JButton-Koordinaten ich festlege. Die Funktion .setBounds(x, y, w, h) bleibt wirkungslos. Zur Info: Die flackernden Buttons waren an der richtigen Position. Für die hat das Festlegen der Koordinaten also wunderbar geklappt.

Ich würde mich sehr über eine Antwort freuen!

Gruß
Björn
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Kannst Du mal ein kurzes komplierbares Bsp mit den animierten JButtons posten?
Swing ist standardmäßig doublebuffered, es muss nicht explizit aktiviert werden.
 

Bjoern82

Mitglied
Kannst Du mal ein kurzes komplierbares Bsp mit den animierten JButtons posten?
Swing ist standardmäßig doublebuffered, es muss nicht explizit aktiviert werden.

Gerne: Hier ist also eine abgespeckte Version von meinem Programm, welches nur die Teile enthält, die direkt mit meinem Problem zusammen hängen:

dieses bsp ist nicht kompilierbar, da sind klassen von dir dabei und syntaxfehler! :/

Entschudigung, du hast Recht! Ich hatte meinen Code auf die Schnelle abgespeckt und dabei ein paar Dinge vergessen. Unten ist nun eine korrigierte, lauffähige Version meines Codes.
 
Zuletzt bearbeitet:

Bjoern82

Mitglied
Hier die korrigierte Version meine Quellcodes:

Java:
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.geom.Rectangle2D.Double;

import javax.swing.JButton;

public class MyClass extends Applet implements Runnable
{
	private static final long serialVersionUID = 1L;
	Thread animator;
	Dimension offDimension;
	Image offImage;
	Graphics2D offGraphics;
	private double scale;
	private Shape offscreenClip;
	private Dimension virtualDimension;
	private Color bg;
	int delay;
	
    
    JButton my_button = new JButton();
	
	public void init()
	{
		virtualDimension = new Dimension(981, 460);
		offscreenClip = new Rectangle2D.Double(0,0,virtualDimension.getWidth(),virtualDimension.getHeight());
		
		setBg(Color.black);
		setLayout(null);
		
		String str = getParameter("fps");
		int fps = (str != null) ? Integer.parseInt(str) : 10;
		delay = (fps > 0) ? (220 / fps) : 100;
						
		my_button = new JButton("Beschriftung");
		my_button.setBounds( 23, 120, 213, 32 );
		my_button.setBackground(Color.black);
		my_button.setForeground(MyColors.Orange);
		my_button.setFont(new Font("Dialog", Font.PLAIN, 15));
		//my_button.setDoubleBuffered(true);
		//my_button.setOpaque(false);
		//my_button.setIgnoreRepaint(true);		
	    add(my_button);	
	}
		
	public void paintFrame(Graphics g)
	{
		Graphics2D g2d = (Graphics2D) g;	
			
		//startscreen_button[0][0].setOpaque(true);
		//startscreen_button[0][0].setLocation(100, 100);
		g2d.setPaint(Color.green);
		g2d.drawRect(13, 110, 233, 52);
		my_button.paint(g2d);	
		//startscreen_button[0][0].setOpaque(false);
		
	}
	
	public void run()
	{
		long tm = System.currentTimeMillis();
		while(Thread.currentThread() == animator)
		{
			repaint();
			try
			{
				tm += delay;
				Thread.sleep(Math.max(1, tm - System.currentTimeMillis()));
			}
			catch(InterruptedException e)
			{
				break;
			}
		}
	}
	
	private void setBg(Color color)
	{
		bg = color;
	}
	
	public void start()
	{
		start(this);
	}
	
	public void start(MyClass myClass)
	{
		animator = new Thread(this);
		animator.start();
	}
	
	public void stop()
	{
		animator = null;
		offImage = null;
		offGraphics = null;
		Audio.bg1.stop();
		Audio.bg2.stop();
		Audio.bg3.stop();
	}

	public void update(Graphics g)
	{
		Dimension size = getSize();
		double scaleX = size.getWidth() / virtualDimension.getWidth();
		double scaleY = size.getHeight() / virtualDimension.getHeight();
		scale = Math.min(scaleX, scaleY);
		scale_buttons(my_button, scale);
		if(offGraphics == null || !offDimension.equals(size))
		{
			offImage = createImage((int)size.getWidth(), (int)size.getHeight());
			offGraphics = (Graphics2D) offImage.getGraphics();
			offGraphics.scale(scale, scale);
			offDimension = size;			
			offGraphics.setRenderingHint(	RenderingHints.KEY_ANTIALIASING,
                    						RenderingHints.VALUE_ANTIALIAS_ON);
		}		
		Double rect = new Rectangle2D.Double(0,0,size.getWidth()/scale,size.getHeight()/scale);
		offGraphics.setColor(Color.black);
		offGraphics.setClip(null);
		offGraphics.fill(rect);
		offGraphics.setClip(offscreenClip);
		offGraphics.setColor(bg);
		offGraphics.fill(rect);
		paintFrame(offGraphics);
		g.drawImage(offImage, 0, 0, null);
	}
	
	void scale_buttons(JButton my_button, double scale)
	{
		my_button.setBounds(	(int)Math.round(scale*(23)),
								(int)Math.round(scale*(120)),
								(int)Math.round(scale*213),
								(int)Math.round(scale*32));
		my_button.setFont(new Font("Dialog", Font.PLAIN, (int)(15*scale)));
	}
}

Was man sieht:
Der Aufruf von .paint() malt zwar einen nicht flimmernden Button, der aber an der falschen Position erscheint. Der richtige Button flimmert dagegen. Wer weiß Rat?
 
Zuletzt bearbeitet:

Bjoern82

Mitglied
Kannst Du mal kurz beschreiben was genau Du vorhast. Aus dem Code werde ich nicht schlau.
Was soll wie animiert werden?

Ich programmiere ein Spiel in einem Applet. (Der Übersichtlichkeit wegen habe ich aber alles, was sich nicht direkt auf die Buttons bezieht raus gelassen). Animiert wird also der Hintergrund. Bisher habe ich auch die Buttons, die ich brauche, alle selbst gemalt, was aber doch eher unprofessionell ist, zumal es ja in Java bereits vorgefertigte Klassen für Buttons gibt. Ich will also GUI-Elemente wie Buttons auf die Bildoberfläche setzen. Das klappt auch, nur flimmern die dann furchtbar, was sehr schlecht aussieht.
Es klappt auch die Buttons mit dem Aufruf von my_button.paint(g) selbst zu zeichnen, dann flimmern die Buttons nicht mehr, dafür werden sie dann aber prinzipiell in die linke obere Ecke gesetzt, egal was bei .setBounds eingestellt wurde. In meinem Beispielprogramm ist das zu sehen. Vielen Dank schon mal im Voraus!
 
G

Guest2

Gast
Moin,

ins Blaue, mindestens:

Java:
extends Japplet

Gruß,
Fancy
 

Michael...

Top Contributor
Weiss jetzt nicht was Du genau vorhast, aber wenn es nur um ein anklickbares Element geht, muss man ja nicht unbedingt einen Button nehmen. Bei einem Spiel würde ich das meiste sowieso selbst zeichnen - ausser ich benötige den vollen Funktionsumfang eines Buttons.

Grundsätzlich sollte man AWT und Swing Komponenten nicht mischen --> also wenn JButton, dann auch JApplet.
Zum zeichnen würde ich nicht direkt auf das Applet malen, sondern eine separate Komponente verwenden und diese ins Applet rein setzen. Das überschreiben von paint oder update kann Probleme verursachen und ist in den meisten Fällen nicht notwendig.
Hier mal ein simples Bsp, wie ich da vorgehen würde. Gezeichnet wird auf einem JPanel in der überschriebenen paintComponent():
Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class MyClass extends JApplet {
	private AnimatorPanel anim;
	private boolean loop;

	public void init() {
		anim = new AnimatorPanel();
		this.setBackground(Color.BLACK);
		this.getContentPane().add(anim);
	}

	public void start() {
		loop = true;
		new Thread(anim).start();
	}
	
	public void stop() {
		loop = false;
	}

	class AnimatorPanel extends JPanel implements Runnable {
		private int degree;

		public AnimatorPanel() {
			this.setLayout(null);
			JButton button = new JButton("Button");
			button.setBounds(20, 20, 300, 65);
			this.add(button);
			degree = 0;
		}

		public void run() {
			while (loop) {
				try {
					Thread.sleep(40);
					degree++;
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
			}
		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			Graphics2D g2 = (Graphics2D) g.create();
			int w = this.getWidth();
			int h = this.getHeight();
			g2.rotate(Math.toRadians(degree), w / 2, h / 2);
			g2.setColor(Color.ORANGE);
			g2.setStroke(new BasicStroke(5));
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2.drawLine(0, 0, w, h);
			g2.dispose();
		}
	}
}
Wenn Du hier den JButton zum flackern bringts, kannst Du ja mal den Code posten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
S Swing Rückmeldung für JButton AWT, Swing, JavaFX & SWT 4
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
U Event Handling JButton Actionevent: starte Spiel AWT, Swing, JavaFX & SWT 4
E JButton füllt ganzes JPanel auf AWT, Swing, JavaFX & SWT 6
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
Kandum Swing JButton - onclick -> Grafikfehler AWT, Swing, JavaFX & SWT 2
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
M Problem mit FlowLayout, JLabel und JButton AWT, Swing, JavaFX & SWT 4
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
D Swing JButton.setenabled(true) funktioniert nicht AWT, Swing, JavaFX & SWT 12
B JButton ausblenden AWT, Swing, JavaFX & SWT 12
G JButton deaktivieren greift nicht AWT, Swing, JavaFX & SWT 14

Ähnliche Java Themen

Neue Themen


Oben