# JButton wird nicht angezeigt



## sk72 (27. Nov 2011)

Kann mir wer sagen, wieso mein JButton nicht angezeigt werden ? 


```
import java.awt.*;
import javax.swing.*;

public class Fenster extends JFrame
{
//	Container c;
	
	Fenster() 
	{
		Container c;
		JFrame fenster = new JFrame();
		fenster.setTitle("Plotter2");
		fenster.setSize(500,350);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		
		c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JButton b = new JButton("Test");
		c.add(b);	
	}
		
	
	public static void main(String[] args) {
		Fenster test = new Fenster();
	}
}
```


----------



## Marcinek (27. Nov 2011)

Wenn du das nach setVisible(true) machst und dann die Oberfläche änders (durch hinzufügen von Buttons) musst die Oberfläche einmal repaint() (en).

Ich würde setVisible() nach dem Hinzufügen machen.

Ebenfalls kommt dieses Thema min. 1x Pro woche.


----------



## sk72 (27. Nov 2011)

```
import java.awt.*;
import javax.swing.*;

public class Fenster extends JFrame
{
	Container c;

	
	Fenster() 
	{
		JFrame fenster = new JFrame();
		fenster.setTitle("Plotter");
		fenster.setSize(500,350);
		
		c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JButton b = new JButton("Test");
		c.add(b);
	
		fenster.setVisible(true);
	
	}
	
	
	public static void main(String[] args) {
		Fenster test = new Fenster();
	}

}
```


sorry, aber das ändert nichts ?


----------



## Marcinek (27. Nov 2011)

Zusätzlich fügst du die JButtons nicht an deinem Fensterobjekt sondern am Frame.

Mach mal das extends Frame weg, dann siehst du es.

Ist ein wenig doppelt gemoppelt.


----------



## damtre (27. Nov 2011)

Dir fehlt die Übergabe deines Containers an den JFrame:


```
fenster.add(c);
```

Gruß

Ausserdem erzeugst du dir einen JFrame fenster, obwohl du von JFrame erbst? Für eines musst du dich entscheiden!


----------



## Quantenbit (27. Nov 2011)

Vielleicht könnte man dies auch abändern.


```
c = getContentPane();
c.setLayout(new FlowLayout());
```

in

```
getContentPane().add(FlowLayout.SOUTH, c);
```

?


----------



## TKausL (27. Nov 2011)

Totaler murks xD


```
import java.awt.*;
import javax.swing.*;
 
public class Fenster extends JFrame
{
    Container c;
 
    
    Fenster() 
    {
        setTitle("Plotter");
        setSize(500,350);
        
        c = getContentPane();
        c.setLayout(new FlowLayout());
        
        JButton b = new JButton("Test");
        c.add(b);
    
        setVisible(true);
    
    }
    
    
    public static void main(String[] args) {
        Fenster test = new Fenster();
    }
 
}
```

So sollte es funktionieren


----------



## damtre (27. Nov 2011)

@TKausL
Also wenn wir jetzt von "Alles Murks" reden, dann bedarf es hier noch einiger Anpassungen.


1. AWT und SWING sollte man trennen:
- Hier ist das nicht der Fall da ein JFrame (Swing) einen Container (AWT) beinhaltet, welcher wiederrum einen JButton(SWING) beinhaltet.

Es gibt für dich 2 Möglichkeiten:

1. Deine Klasse erbt von JFrame und du positionierst deine Elemente alle auf diesem JFrame.


```
public class Fenster extends JFrame {

	public static void main(String[] args) {
		new Fenster();
	}

	Fenster() {

		setTitle("Plotter2");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new FlowLayout());

		JButton b = new JButton("Test");
		add(b);
		setVisible(true);

	}
}
```


2. Du erzeugst innerhalb deiner Klasse eine Instanz von JFrame und positionierst dort alle Elemente, mit dem Unterschied dass du als Container nicht mit der Klasse Container sondern mit der Klasse JPanel arbeitest.


```
public class Fenster {

	public static void main(String[] args) {
		new Fenster();
	}

	Fenster() {

		JFrame fenster = new JFrame();
		JPanel fensterContainer = new JPanel();
		fenster.setTitle("Plotter2");
		fenster.setSize(500, 350);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fensterContainer.setLayout(new FlowLayout());

		JButton b = new JButton("Test");
		fensterContainer.add(b);
		fenster.add(fensterContainer);
		fenster.setVisible(true);

	}
}
```

Du hattest vorhin in deinem Code quasi eine Mischung aus beidem gemacht. Für eine Vorgehensweise sollte man sich dann entscheiden.

Gruß


----------



## sk72 (28. Nov 2011)

Okay, vielen Dank euch allen ! 

Wahrscheinlich ist meine Frage jetzt doof, aber welche der beiden o.g. Varianten ist "schöner" bzw. besserer Programmierstil ? 


Lg sk'


----------



## sk72 (28. Nov 2011)

Zusätzlich noch eine weitere Frage:

Ich möchte ein Koordinatensystem zeichnen. Muss ich das auf meinen JFrame erzeugen bzw. wird das seperat erzeugt ? Mit welcher Klasse muss ich da arbeiten ?


----------



## Michael... (28. Nov 2011)

sk72 hat gesagt.:


> Wahrscheinlich ist meine Frage jetzt doof, aber welche der beiden o.g. Varianten ist "schöner" bzw. besserer Programmierstil ?


Letztere, da man nur von anderen Klassen erben sollte, wenn man diese auch tatsächlich in Ihrer Funktionalität erweitern will. Hier soll aber nur ein JFrame verwendet werden.

Für solche Spielereien verwende ich aber auch meistens die erste Variante.


sk72 hat gesagt.:


> Ich möchte ein Koordinatensystem zeichnen. Muss ich das auf meinen JFrame erzeugen bzw. wird das seperat erzeugt ? Mit welcher Klasse muss ich da arbeiten ?


Dafür gibt es - zumindest in der Standard API - keine fertige Komponente. Generell kann man mit Swing solche Sachen selbst zeichnen, in dem man z.B. von JComponent erbt und deren 
	
	
	
	





```
paintComponent(Graphics g)
```
 überschreibt.


----------



## sk72 (28. Nov 2011)

Ich hoffe, ich bin auf dem richtigen Weg .. 


```
import java.awt.*;
import javax.swing.*;

public class Fenster
{
	
	Fenster() 
	{
		JFrame fenster = new JFrame();		
		JPanel fensterContainer = new JPanel();
		fenster.setTitle("Plotter");
		fenster.setSize(500,350);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fensterContainer.setLayout(new FlowLayout());	
		fenster.setVisible(true);	
	}
	
	public void paint(Graphics g) 
	{	
		g.drawLine(0,0,0,100);
		g.drawLine(0,0,100,0);
	}

	
	
	public static void main(String[] args) {
		 new Fenster();
	}

}
```


Wie füge ich das Koordinatensysten meinem JPanel hinzu ?


----------



## TKausL (28. Nov 2011)

```
repaint();
```


----------



## sk72 (28. Nov 2011)

Sorry, aber mit solchen Aussagen kann ich als Laie nichts anfangen. :/


----------



## SlaterB (28. Nov 2011)

benenne bitte keine Variablen genau wie Klassen, nur kleingeschrieben, wenn sie nicht vom selben Typ sind

> Fenster fenster;
naja, gibts oft

aber 
> class Fenster
und dann
> JFrame fenster;
das ist nicht gut..


--------

die paint-Methode in der Nicht-GUI-Klasse Fenster ist komplett belanglos, 
wenn du von JFrame erben würdest, dann wärs ja denkbar, aber auch nicht geeignet,

wie man 'Zeichen in Swing' anfängt liefern die markieren Begriffe in einer Suchmaschine endlos,
bzw. jedes Lehrbuch komplett sauber in eigenen Kapiteln, unmöglich nicht zu finden..

Galileo Computing :: Java ist auch eine Insel - 14 Einführung in grafische Oberflächen
14.9.3 Zeichnen von Inhalten auf ein JFrame


----------

