Verbuggte custom JButton unter Windows

peemo_royal

Mitglied
Hi!

Folgendes Problem:
Ich habe mir eigene Button gebaut mit HIntergrundbild. Sehen auch ganz gut aus und auf meinem MAc funzen sie auch ohne Probleme aber auf WIndows siehts furchtbar aus.
1. Wenn man drüberfährt werden sie dunkler und bleiben auch so
2. Wenn man über ein label oder button drüberfährt und danach über einen anderen, wird das image des vorangehenden leicht in den hintergrund des anderen Button gezeichnet. Aber seht selbst :



Hier mal der Code zum Button:
Java:
package reversi;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;

import javax.swing.BorderFactory;
import javax.swing.ButtonModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;

import sun.java2d.loops.DrawRect;

public class MyButton extends JButton {

	private String text;
	private Image startImg;
	private Image pressedImg;
	private Image enabledImg;

	public MyButton(String text) {
		super(text);
		this.text = text;
		this.startImg = new ImageIcon(this.getClass().getClassLoader()
				.getResource("StartButton.png")).getImage();
		this.pressedImg = new ImageIcon(this.getClass().getClassLoader()
				.getResource("PressedButton.png")).getImage();
		this.enabledImg = new ImageIcon(this.getClass().getClassLoader()
				.getResource("PressedButton.png")).getImage();
	}

	protected void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		super.paintComponents(g2d);
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
				RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		int h = this.getHeight();
		int w = this.getWidth();
		ButtonModel model = getModel();

		// draw Image

		if (model.isEnabled()) {
			g2d.drawImage(startImg, 0, 0, w, h, MyButton.this);
		} else {
			// draw helleren button.... tbd
			// g2d.drawImage(enabledImg, 0, 0, w, h, MyButton.this);

		}
		if (model.isPressed()) {
			g2d.drawImage(pressedImg, 0, 0, w, h, MyButton.this);
		}
		// if (model.isRollover()) {
		// g2d.drawImage(startImg, 0, 0, w, h, MyButton.this);
		// }

		Font font = new Font("label", Font.BOLD, w / 10);
		g2d.setColor(new Color(249, 243, 222));
		g2d.setFont(font);

		int textSize = g2d.getFontMetrics().stringWidth(text);
		int posX = (w - textSize) / 2;
		int posY = (int) (h / 1.5);

		g2d.drawString(this.text, posX, posY);

	}

}

und wie ich die Button einbinde:
Java:
	startPanel = new BackgroundPanel(this.background);
		startPanel.setLayout(gridBagLayout);
		GridBagConstraints c = new GridBagConstraints();

		createAvatars();
		avaLabelList = createAvatarList();

		nextAvaButton = new JButton(new ImageIcon(blackArrowRight));
		nextAvaButton.setPreferredSize(avaButtonSize);
		nextAvaButton.setOpaque(false);
		nextAvaButton.setContentAreaFilled(false);
		nextAvaButton.setBorderPainted(false);
		nextAvaButton.setPressedIcon(new ImageIcon(greenArrowRight));

		prevAvaButton = new JButton(new ImageIcon(blackArrowLeft));
		prevAvaButton.setPreferredSize(avaButtonSize);
		prevAvaButton.setOpaque(false);
		prevAvaButton.setContentAreaFilled(false);
		prevAvaButton.setBorderPainted(false);
		prevAvaButton.setPressedIcon(new ImageIcon(greenArrowLeft));

		// Buttons for MenuHandling
		offLineButton = new MyButton("OFFLINE");
		offLineButton.setPreferredSize(buttonSize);
		onLineButton = new MyButton("ONLINE");
		onLineButton.setPreferredSize(buttonSize);
		quitButton = new MyButton("QUIT");
		quitButton.setPreferredSize(buttonSize);

		// Add Avatars
		c.gridx = 0;
		c.gridy = 0;
		c.insets = new Insets(0, 20, 20, 20);
		startPanel.add(prevAvaButton, c);

		c.gridx = 1;
		c.gridy = 0;
		startPanel.add(avaLabel0, c);
		startPanel.add(avaLabel1, c);
		startPanel.add(avaLabel2, c);
		startPanel.add(avaLabel3, c);
		startPanel.add(avaLabel4, c);

		c.gridx = 2;
		c.gridy = 0;
		startPanel.add(nextAvaButton, c);
		// BUTTONS
		c.insets = new Insets(20, 0, 0, 0);
		c.gridx = 1;
		c.gridy = 1;
		startPanel.add(offLineButton, c);
		c.gridx = 1;
		c.gridy = 2;
		startPanel.add(onLineButton, c);
		c.gridx = 1;
		c.gridy = 3;
		startPanel.add(quitButton, c);

Ein ähnliches Problem hab ich auch mit einer Custom JScrollBar, aber wenn das gelöst werden sollte weiss ich glaub ich auch wie das andere funzt ;)
Ich hab ehrlich gesagt keine Idee was ich falsch mach. Liegts an der Paint Mehtode oder am LAyout?
Bei meinem Mac tritt das Problem gar nicht auf, nur das mit der ScrollPAne...

Ich hoffe ihr könnt mir helfen. Muss übermorgen abgeben und bin ein wenig am verzweifeln.

€dit: hab den button jetzt au setRollOverEnabled(false) gesetzt, jetzt passierts nur noch wenn man ihn klickt, selbes ergebnis aber :(
Grüße Peter
 
Zuletzt bearbeitet:
I

IMartin

Gast
Das Layout habe ich mir nicht angesehen. In der Button-Klasse wird in
Code:
paintComponent(Graphics)
nicht
Code:
super.paintComponent(Graphics)
, sondern
Code:
super.paintComponents(Graphics)
aufgerufen. Würde ich nicht tun. Außerdem würde ich den Text nicht selber zeichnen, sondern JButton arbeiten lassen.

Nicht bis ins Detail durchdacht und auch ohne rollover image, aber tut unter meinem Windows:
Java:
public class MyButton extends JButton {

	private Image startImg;
	private Image pressedImg;

	public MyButton(String text) {
		super(text);
		
		startImg = new ImageIcon(MyButton.class.getResource("StartButton.png")).getImage();
		pressedImg = new ImageIcon(MyButton.class.getResource("PressedButton.png")).getImage();
		
		setContentAreaFilled(false);
		setFocusPainted(false);
		setForeground(new Color(249, 243, 222));
		Font font = getFont();
		setFont(new Font(font.getFamily(), Font.BOLD, 18));
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		Image img = null;
		if(model.isEnabled()) {
			if(model.isPressed()) {
				img = pressedImg;
			}
			else {
				img = startImg;
			}
		}
		else {
			// TODO hellerer button
		}
		if(img != null) {
			g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
		}
		
		super.paintComponent(g);
	}

}
 
Zuletzt bearbeitet von einem Moderator:

peemo_royal

Mitglied
danke schonmal, ich probiers gleich mal...

Ich zeichne den String selber, weil ich den Text halt zentrieren möchte. Hab da keine andere möglichkeit gefunden...


Ok. Wenn ich die super.paintcomponent s() aufrufe dann passiert der bug, wenn ich die super.paintcoomponent() calle dann hab ich nochmal hässliche StandardButtons im Hintergrund. Die hab ich dann mit dem Rest wohl auf false gesetzt.

Scheint zu funktionieren... Vielen Dank!

Ich wusste ehrlich gesagt gar nicht dass es da seinen unterschied zw s und nicht s gibt....

Grüße Peter
 
Zuletzt bearbeitet:
I

IMartin

Gast
Zumindest unter meinem Windows wird der Buttontext automatisch zentriert. Die Ausrichtung kann man aber auch einstellen:
Java:
setHorizontalAlignment(SwingConstants.CENTER);
 
I

IMartin

Gast
Schön zu hören, trotzdem noch eine Anregung: Man könnte Bild und Text auch überlagern, ohne
Code:
paintComponent(Graphics)
zu überschreiben:
Java:
		setHorizontalAlignment(SwingConstants.CENTER);
		setHorizontalTextPosition(SwingConstants.CENTER);

Da können aber unter Umständen hässliche, 1px breite Ränder zwischen Border und Bild entstehen. Also vielleicht Border weg und mit auf das png zeichnen, falls überhaupt eine Border gewüscht ist. Dann sieht die Button-Klasse nur noch irgendwie so aus und eine Factory-Methode statt der Klasse würde reichen:
Java:
public class MyButton extends JButton {

	public MyButton(String text) {
		super(text);
		
		setIcon(new ImageIcon(MyButton.class.getResource("StartButton.png")));
		setPressedIcon(new ImageIcon(MyButton.class.getResource("PressedButton.png")));
		setRolloverIcon(new ImageIcon(MyButton.class.getResource("RolloverButton.png")));
		
		setBorder(BorderFactory.createEmptyBorder());
		setContentAreaFilled(false);
		setFocusPainted(false);
		setForeground(new Color(249, 243, 222));
		Font font = getFont();
		setFont(new Font(font.getFamily(), Font.BOLD, 18));
		setHorizontalAlignment(SwingConstants.CENTER);
		setHorizontalTextPosition(SwingConstants.CENTER);
	}

}
 

peemo_royal

Mitglied
Schön zu hören, trotzdem noch eine Anregung: Man könnte Bild und Text auch überlagern, ohne
Code:
paintComponent(Graphics)
zu überschreiben:
Java:
		setHorizontalAlignment(SwingConstants.CENTER);
		setHorizontalTextPosition(SwingConstants.CENTER);

Da können aber unter Umständen hässliche, 1px breite Ränder zwischen Border und Bild entstehen. Also vielleicht Border weg und mit auf das png zeichnen, falls überhaupt eine Border gewüscht ist. Dann sieht die Button-Klasse nur noch irgendwie so aus und eine Factory-Methode statt der Klasse würde reichen:
Java:
public class MyButton extends JButton {

	public MyButton(String text) {
		super(text);
		
		setIcon(new ImageIcon(MyButton.class.getResource("StartButton.png")));
		setPressedIcon(new ImageIcon(MyButton.class.getResource("PressedButton.png")));
		setRolloverIcon(new ImageIcon(MyButton.class.getResource("RolloverButton.png")));
		
		setBorder(BorderFactory.createEmptyBorder());
		setContentAreaFilled(false);
		setFocusPainted(false);
		setForeground(new Color(249, 243, 222));
		Font font = getFont();
		setFont(new Font(font.getFamily(), Font.BOLD, 18));
		setHorizontalAlignment(SwingConstants.CENTER);
		setHorizontalTextPosition(SwingConstants.CENTER);
	}

}


hab das mal getestet, leider wird bei mir kein Text angezeigt...Ausserdem geht der abgerundete look den die Buttons haben wenn sie größer sind dabei verloren.
Danke aber nochmal!
 
I

IMartin

Gast
Abgerundeter Look:
Ist eine Layout Sache. Die preferred size des Buttons ist vermutlich kleiner als das Bild.
Code:
Graphics.drawImage(Image, int, int, int, int, ImageObserver)
skaliert das Bild. Ein Bild, das über
Code:
AbstractButton.setIcon(Icon)
gesetzt wurde, wird gegebenenfalls abgeschnitten.

Fehlender Text:
Könnte am verwendeten Look and Feel liegen. Funktioniert bei mir mit Metal oder auch Nimbus.

Grundsätzlich, wenn das L&F nicht das übliche sein soll, würde ich mir aus den frei verfügbaren L&Fs eines aussuchen, das
  • meinen Wünschen möglichst nahe kommt und
  • möglichst einfach konfigurierbar ist, so dass ich das, was nicht meinen Wünschen entspricht, einfach ändern kann. Ich denke da auch an ein anderes Thema mit ScrollBars. Nimbus kann man Painter für die Buttons/ScrollBars geben, in anderen L&Fs funktioniert das zum Teil über Bilder.
 

peemo_royal

Mitglied
ja darauf bin ich auch schon gekommen mittlerweile ;)

Das mit dem LookAndFeel ist interessant, damit hab ich mich noch gar nicht auseinandergesetzt, ich bin ja noch nicht so lang am Java programmieren. Aber da werd ich mal schaun was sich machen lässt.
Mit dem Buttons bin ich eigentlich mit der paintComponent fürs erste zufrieden, aber ich werd mich mal an die ScrollBars wagen. Danke dir!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
F JavaFX Custom Exceptions AWT, Swing, JavaFX & SWT 5
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Gluon Scene Builder Custom AWT, Swing, JavaFX & SWT 0
B JavaFX Custom TextInputControl AWT, Swing, JavaFX & SWT 1
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
F JavaFX Custom ListView erstellt ghost Element AWT, Swing, JavaFX & SWT 3
X Custom Controls AWT, Swing, JavaFX & SWT 5
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
L JavaFX Custom control mit Hover Effekt AWT, Swing, JavaFX & SWT 2
M Swing JColorchooser anpassen - custom style? AWT, Swing, JavaFX & SWT 0
M JavaFX Parameter für Custom Control in FXML übergeben? AWT, Swing, JavaFX & SWT 4
B Custom JTabbedPane-Tab-Design AWT, Swing, JavaFX & SWT 2
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
G TitledPane Custom Title AWT, Swing, JavaFX & SWT 6
N Custom JButton Feld aus Parent lesen lassen AWT, Swing, JavaFX & SWT 11
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
lumo SWT JFace Databinding +Custom Table AWT, Swing, JavaFX & SWT 2
B Swing JTable custom ColumnModel Problem AWT, Swing, JavaFX & SWT 5
W Swing Tag Oder Custom Eintrag AWT, Swing, JavaFX & SWT 7
algorismi Custom JDesktopIcon AWT, Swing, JavaFX & SWT 5
hdi Custom Cursor: Problem mit Größe AWT, Swing, JavaFX & SWT 5
N JComboBox mit Custom Object AWT, Swing, JavaFX & SWT 2
V Frage zu JScrollPane mit Custom Headern, mit Beispiel AWT, Swing, JavaFX & SWT 2
S [S] custom tree componente AWT, Swing, JavaFX & SWT 8
Z MessageDialog mit Custom panel erstellen AWT, Swing, JavaFX & SWT 2
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

Ähnliche Java Themen

Neue Themen


Oben