# JButton wird nicht dargestellt



## bossa (23. Apr 2010)

Hallo,
ich denke ich habe ein kurzes, schnell lösbares Problem.

Ich brauche eine einfache Oberfläche, für die mir die Funktionalität von AWT in Frames ausreicht. Bis auf einen Punkt. Bei einem Button hätte ich gern ein kleines Icon.

Google spuckt haufenweise gute kleine Codesamples aus, die mir auch alle völlig logisch erscheinen. Dennoch, wenn ich den einzigen Button mit Bild nun als JButton deklariere und ein Bild draufsetzen will gibt es Probleme mit der Darstellung, die sich folgendermaßen äußern:
*Windows*: Button wird samt Icon erst dann gezeigt, wenn man mit der Mouse drüberfährt (getestet mit Programmstart aus Eclipse und von der Konsole)
*Mac*: Button wird gar nicht angezeigt (getestet mit Programmstart aus Eclipse)

Hier die brisanten Teile des Codes extrahiert zu einem kleinen Beispielprogrämmchen ohne weitere Funktionalität:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.SwingConstants;

public class ButtonDemo extends Frame
{
	static ButtonDemo eineDemo;

	//Menueleiste
	ImageIcon bild = new ImageIcon("home.gif");
	JButton		home = new JButton(bild);
	Button		back = new Button(),
		   		fwd = new Button();
	AktionsAbhoerer einAbhoerer;
	
	public static void main(String args[])
	{
		eineDemo = new ButtonDemo();
		eineDemo.setSize(640,480);
		eineDemo.setVisible(true);	    
	}
	public ButtonDemo()
	{		
		//overall		
		setLayout(null);
		setUndecorated(true);
		setSize(640,480);
		setBackground(Color.white);
		
		//Menueleiste
		add(home);
		home.setBounds(0, 15, 55, 44);
		home.setBackground(Color.LIGHT_GRAY);		
		home.setHorizontalAlignment(SwingConstants.CENTER);
		home.setVerticalAlignment(SwingConstants.CENTER);
		home.setIcon(bild);
		/* home.setIcon(bild); bringt keine Änderung, auch ohne ist der Button unter 
Windows sichtbar, sobald die Mouse rüberhuscht. Die Funktion home.setRolloverEnabled(false); 
setze wird der Hintergrund sogar transparent */

	
		
		add(back);
		back.setBounds(540, 15, 50, 44);
		back.setBackground(Color.LIGHT_GRAY);
		back.setLabel("<");
		add(fwd);
		fwd.setBounds(590, 15, 50, 44);
		fwd.setBackground(Color.LIGHT_GRAY);
		fwd.setLabel(">");
		
		einAbhoerer = new AktionsAbhoerer(this);		
	}

	public void paint (Graphics g)
	{	
		g.drawRect(0, 15, 55, 44);      //Markierung der Fläche, wo der Button erscheinen soll	
	}	
}
```


Ich vermute irgendwas extentielles für die richtige Verwendung von JButton habe ich vergessen. Aber mir fällt auch einfach nicht mehr ein, wonach ich dann nun suchen soll...


----------



## SlaterB (23. Apr 2010)

public void paint (Graphics g)
    {  
super.paint(g);

der super-Aufruf sorgt vielleicht dafür, dass der Rest richtig gemalt wird,
allgemein ist nicht zu empfehlen, gleichzeitig in einer Komponente zu malen als auch andere Objekte einzufügen,
wenn du aber einen Rahmen drumherum malen willst, gehts wohl anders kaum (außer Border in Swing)

Swing JButton besser nicht mit AWT Frame kombinieren, Frame + Button oder JFrame + JButton geht


----------



## MiDniGG (23. Apr 2010)

Hi,

probiere mal den add erst nach dem Bearbeiten zu machen:


```
home.setBounds(0, 15, 55, 44);
home.setBackground(Color.LIGHT_GRAY);       
home.setHorizontalAlignment(SwingConstants.CENTER);
home.setVerticalAlignment(SwingConstants.CENTER);
home.setIcon(bild);
add(home);//ERST HIER
```

Ansonsten könntest Du am Ende noch ein validate(); probieren.

Gruß


----------



## bossa (23. Apr 2010)

SlaterB hat gesagt.:


> public void paint (Graphics g)
> {
> super.paint(g);


Funktioniert erstmal. Danke!




SlaterB hat gesagt.:


> der super-Aufruf sorgt vielleicht dafür, dass der Rest richtig gemalt wird,
> allgemein ist nicht zu empfehlen, gleichzeitig in einer Komponente zu malen als auch andere Objekte einzufügen,
> wenn du aber einen Rahmen drumherum malen willst, gehts wohl anders kaum (außer Border in Swing)


Der Rahmen war nur, um zu zeigen wo der Button ist. Original ist der nicht dabei gewesen...




SlaterB hat gesagt.:


> Swing JButton besser nicht mit AWT Frame kombinieren, Frame + Button oder JFrame + JButton geht


Bin ich auch angegangen, versuch das gleich noch mal.... Moment noch.




MiDniGG hat gesagt.:


> Hi,
> 
> probiere mal den add erst nach dem Bearbeiten zu machen:
> 
> ...


Hat nichts geholfen... Schade, trotzdem danke!




MiDniGG hat gesagt.:


> Ansonsten könntest Du am Ende noch ein validate(); probieren.
> 
> Gruß


Auch nicht, leider...


----------



## bossa (23. Apr 2010)

So, JFrame noch mal getestet.

Unter Windows funktioniert es nur dann korrekt, wenn ich die Methode

```
super.paint(g);
```
aufrufe.

Unter Mac funktioniert es mithilfe von JFrame korrekt.



@SlaterB
Wenn ich nicht gleichzeitig Zeichnen und Elemente einfügen soll, was ist dann die empfohlene Variane? Es muss eine äußerst klare Darstellung auf sehr kleinem Display werden, deswegen wollte ich einige Linien zur optischen Abtrennung und einige leicht graue Hintergrundflächen haben, um einfach das kleine Display (voraussichtlich 5") gut optisch zu strukturieren.

Ein Schlagwort zum suchen reicht mir - ich will euch nicht so viel Mühe machen.


----------



## SlaterB (23. Apr 2010)

nun, die Alternative ist klar: painten in SubKomponenten,
Panel A enthält Buttons und Panel X, nur in X wird gemalt, in der ansonsten komplett freien Fläche, ohne störende andere GUI-Komponenten mittendrin,




in JFrame besser nicht die paint-Methode überschreiben, was in AWT halbwegs erlaub ist,
dort besser nur in Unter-JPanels malen (was in AWT teils auch gar nicht geht wenn ich mich recht erinnere),
und dann paintComponent überschreiben


Lesson: Performing Custom Painting (The Java™ Tutorials > Creating a GUI With JFC/Swing)


----------



## bossa (23. Apr 2010)

Hm,
wenn ich meinen Quelltext nach diesem (ja guten) Tutorial umschreibe, dann funktioniert setUndecorated() für das JFrame nicht mehr ;(

Nun gut, dann muss ich erstmal aufhören, muss nach Hause...
Danke soweit!


----------

