Swing JButton paintComponent überschreiben

KingEldarion

Bekanntes Mitglied
Hi,

ich versuche gerade meine Buttons zu gestalten, da die Standartjavabuttons ja sehr hässlich sind.
Also habe ich mich rangemacht und eine neue Klasse erstellt die von JButton erbt erstellt.
Nun habe ich die paintComponent und die Methode paint überschrieben:

Java:
public GButton(String text, int x, int y){
		
		this.text = text;
		
		setBounds(x, y, 250, 25);
		addMouseListener(this);
		setContentAreaFilled(false);
		
		URL url = null;
		
		try {
			url = getClass().getClassLoader().getResource("pic/button.png");
			backPic = ImageIO.read(url);
			url = getClass().getClassLoader().getResource("pic/buttonHover.png");
			hoverPic = ImageIO.read(url);
			url = getClass().getClassLoader().getResource("pic/buttonClick.png");
			clickPic = ImageIO.read(url);
		} 
		catch (IOException e) {
			System.out.println("Error: " + e);
			new ErrorMessage("" + e);
		}
	}
	
	@Override
	public void paintComponent(Graphics g){
		
	}
	
	@Override
	public void paint(Graphics g){
		if(hover){
			if(click){
				g.drawImage(clickPic, getX(), getY(), null);
			}
			else
			{
				g.drawImage(hoverPic, getX(), getY(), null);
			}
		}
		else
		{
			g.drawImage(backPic, getX(), getY(), null);
		}
		
		g.drawString(text, getX(), getY());
	}

Das Ergebnis sind nur leider so aus, dass das Bild nicht gezeichnet werden, der String aber schon, warum?

MfG KingEldarion
 
Grundsätzlich sollte man bei Swing Komponenten
- paintComponent überschreiben und die paint nach Möglichkeit in Ruhe lassen
- darin als ersten Aufruf am besten super.paintComponent aufrufen (sofern man nicht eh die komplette überpinselt)

Dann stellt sich noch die Frage wo sind die Variablen hover... deklariert und wo werden Sie gesetzt?

###EDIT
Wenn Du sowieso alles überschreibst/selbst implementierst macht es eigentlich keinen Sinn von JButton zu erben. Da könnte man direkt von JPanel oder JComponent erben.
 
Zuletzt bearbeitet:
hast du das Bilder- + String-Malen alles schon ausführlich in unverfänglichen normalen Zeichenflächen getestet?

zufällig ist es so, dass für einen String der y-Wert die Unterkante ist, es wird darüber gemalt,
für ein Bild bzw. meistens ist y aber die Oberkante, es wird darunter gemalt,

falls y genau die Unterkante des Label-Zeichenbereichs ist, dann würde genau der String noch zu sehen sein, das Bild nicht..,

male testweise bisschen mehr, eine horizontale Linie bei Y, bei Y -10 usw., versetze das Bild etwas höher,

ganz generell ist es fraglich, die x/y Koordinaten des Labels, welches zur Positionierung im äußeren Layout (null-Layout?) gedacht sind,
für das interne Zeichnen zu verwenden,
was wird bisher als x + y übergeben, kleine Werte im Bereich von 25 für y? alles andere würde wohl eh nicht funktionieren im Moment,

wenn das Label die Höhe 25 bekommt, dann arbeite mit diesem 25er-Bereich, und x von 0 bis 250,
ganz egal wo auf dem Bildschirm positioniert


wieso überschreibst du eigentlich paint und nicht paintComponent?
mag sein dass nur in letzterer die lokalen Koordinanten besonders wichtig sind,
arbeite unbedingt dort und vergesse den super-Aufruf zu Beginn nicht

als erstes male eine schönes gefülltes grünes Rechteck von -1000 bis +1000, ist das bzw. etwas davon zu sehen?
wenn ja dann langsam näher an den sicht-/bemalbaren Bereich herantasten
 
Danke,

es klappt wenn ich die Bilder auf x und y = 0 setze, wiedermal dämlich von mir...
Die Paintmethode muss ich ja aber überschreiben, da ich sonst weiterhin den Rahmen des StandartButtons habe, ich möchte aber meine komplett eigene Buttons habe und das funktioniert jetzt auch, aber ich habe noch eine kleine Frage, wie kriege ich bei dem drawString hin, dass ich die Schriftgröße einstellen kann?

Ich weiß wie ich die Farbe und den Font ändern kann, aber es gibt keine setter Methode für die Schriftgröße, oder mache ich das mit Font?

MfG KingEldarion
 
Die Paintmethode muss ich ja aber überschreiben, da ich sonst weiterhin den Rahmen des StandartButtons habe, ich möchte aber meine komplett eigene Buttons habe und das funktioniert jetzt auch,
Da Du - so wie es aussieht - gar nichts von JButton nutzt, macht es keinen Sinn von JButton zu erben (s. mein EDIT)
Ich weiß wie ich die Farbe und den Font ändern kann, aber es gibt keine setter Methode für die Schriftgröße, oder mache ich das mit Font?
Man kann beim Graphics Objekt per setFont(Font) einen beliebigen Font setzen. Den kann man direkt per new Font(....) selbst erzeugen oder per deriveFont(...) von einem bestehenden ableiten.
 

Zurück
Oben