# JButton erscheint erst bei Mouseover



## sheddy (2. Okt 2013)

Hallo, 

ich habe ein JPanel auf dem mehrere JButtons sind. Nach dem ich das Panel ändere und mit revalidate neuaufbauen lasse, erscheinen die JButtons erst, wenn ich mit der Maus drüber fahre. Kann mir jemand erklären wie ich das Problem lösen kann?!

Gruß
Sdy


----------



## André Uhres (2. Okt 2013)

sheddy hat gesagt.:


> Nach dem ich das Panel ändere und mit revalidate neuaufbauen lasse, erscheinen die JButtons erst, wenn ich mit der Maus drüber fahre. Kann mir jemand erklären wie ich das Problem lösen kann?!



In deinem Fall muss dem Aufruf von revalidate möglicherweise auch noch ein Aufruf von repaint folgen.

Gruß,
André


----------



## sheddy (2. Okt 2013)

Arg...anderer Fehler. Habe einen Block zu früh geschlossen, so dass eine Methode nicht mehr aufgerufen wurde, die alles neu validieren sollte. 

Sorry...aber trotzdem dank für den Tipp.

Gruß
Sdy


----------



## sheddy (3. Okt 2013)

Jetzt taucht das Problem an einer anderen Stelle auf - wenn man die Größe des Fensters ändert.


1. Aufruf des Dialogs - Buttons sichtbar
2. Größe ändern - Buttons sichtbar
3. "Neuzeichnen" des JPanels und Buttons - Buttons sichtbar
4. Größe ändern - Buttons nicht sichtbar

Ich habe es schon mit einem ComponentAdapter an dem neuzuzeichnen Panel versucht. Dieser wird auch aufgerufen, jedoch bringen die Aufrufe von revalidate des Panels und validate des ganzen Dialogs nichts. Die Buttons sind erst nach einem erneutem Mouseover wieder sichtbar.


Gruß
Sdy


----------



## André Uhres (4. Okt 2013)

Das Problem könnte eventuell entstehen, wenn wir Mal-Methoden wie "paintComponent" überschreiben, aber nicht die Super-Implementation aufrufen,  wie z.B. "super.paintComponent(g)".

Gruß,
André


----------



## sheddy (4. Okt 2013)

Ich habe jedoch keine paintComponent-Methode überschrieben. Daher wüsste ich auch nicht, wo ich die Methode aufrufen sollte, da ich keine mEthdoe mit einem Graphics-Object als Parameter habe :/


----------



## André Uhres (4. Okt 2013)

Ich fürchte, da bin ich mit meinem Latein am Ende. Vielleicht kann ein KSKB helfen, das musst du allerdings selber erstellen.

Gruß,
André


----------



## sheddy (4. Okt 2013)

Ich werde mal etwas entwerfen. Dauert aber ein wenig, das Problem nachzustellen


----------



## sheddy (2. Mrz 2014)

So, mein Projekt war erst einmal auf Eis gelegt, daher jetzt erst die Rückmeldung.

Im Anhang hängt der _reine _SourceCode mit einem kompilierbaren Beispiel dran. Ich habe es so minimalistisch gehalten wie möglich, um wirklich nur das Problem zu zeigen.

Der Fehler zeigt sich wie folgt:

1. Im Menü neuen Tab aufmachen
2. In der Mitte auf den Button klicken

Nun taucht das Problem auf:

1. Der untere Button wird erst mal gar nicht dargstellt, sondern erst, wenn man mit der Maus drüber fährt.

2. Wenn man das Fenster vergrößert oder verkleinert, verschwinden die Buttons wieder und erscheinen erst beim Mouseover.

3. Wenn man in einem Tab das Layout bereits geändert hat (durch Klick auf den einzelnen Button), einen neuen Tab aufmacht und zwischen den Tabs wechselt, so verschwinden die beiden Buttons in dem Tab, in dem das Layout bereits geändert wurde und erscheinen erst wieder beim Mouseover. 

Ich bin wirklich ratlos, was ich aufrufen muss, damit die Buttons, wie beim intialen Erstellen des Tabs mit dem einzelnen Button, immer angezeigt werden - auch nach einem Tab-Wechsel oder dem Vergrößern/Verkleinern des Fensters.

Vielen Dank für jegliche Hilfe.

Viele Grüße
Sdy

Hier noch einmal der Code fürs Forum:

*Main.java*


```
public class Main {

	public Main() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Hauptfenster();
	}

}
```

*Hauptfenster*


```
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTabbedPane;


public class Hauptfenster extends JFrame {
	
	public Hauptfenster(){
		super("Test");
		setSize(1000, 700); // groesse des fenster
		setMinimumSize(getSize());		
		setDefaultCloseOperation(EXIT_ON_CLOSE);		
		setResizable(true);		
		this.setVisible(true); // macht alle fenster sichtbar
		
		
		// Menü-Leiste
		JMenuBar menu = new JMenuBar();
		// Auswahl-Menü: Datei
		JMenu file = new JMenu("Datei");
		// Datei > Neu
		JMenu _new = new JMenu("Neu");		
		// Datei > Neu > Ehrenscheibe
		JMenuItem tab = new JMenuItem("Tab");		
		
		// Auswahlmenüs zur Leiste hinzufügen
		menu.add(file);	
		_new.add(tab);
		file.add(_new);
		setJMenuBar(menu);	
		
		JTabbedPane tabPane = new JTabbedPane();	
		
		// tabbedPane zum Fenster hinzufügen
		add(tabPane);
		
		
		tab.addActionListener(new TabEvent(tabPane));
	}

}
```

*TabEvent*


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.JTabbedPane;


public class TabEvent implements ActionListener {

	
	private JTabbedPane pane;
	
	public TabEvent(JTabbedPane pane) {
		// TODO Auto-generated constructor stub
		this.pane = pane;		
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		pane.addTab("asas", new TabPanel(pane));

	}

}
```

*TabPanel*


```
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;


public class TabPanel extends JPanel implements ActionListener {

	private JPanel centerPanel = null;
	private JTabbedPane tabPane = null;
	
	public TabPanel(JTabbedPane tabPane) {
		// TODO Auto-generated constructor stub
		this.tabPane = tabPane;
		
		setLayout(new BorderLayout());
		
		
		// Liste links
		JPanel listPanel =  new JPanel(new BorderLayout());		
		JList list = new JList();
		
		JScrollPane scroller = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scroller.setPreferredSize(new Dimension(250, 0)); 
		listPanel.add(list, BorderLayout.CENTER);
		
		add(scroller, BorderLayout.WEST);
		
		
		_setLayout(0);

	}
	
	
	private void _setLayout(int type) {
		
		if(centerPanel != null){
			centerPanel.removeAll();
			centerPanel = null;
		}
		
		// Mitte des Tabs
		if(type == 0){
			centerPanel = new JPanel(new GridBagLayout());

			JButton btn = new JButton("Nummer 1");
			btn.addActionListener(this);

			centerPanel.add(btn);

			add(centerPanel);		
		}else{			
			centerPanel = new JPanel(new BorderLayout());
			
			JButton btn1 = new JButton("Nummer 1");
			JButton btn2 = new JButton("Nummer 2");
			
			centerPanel.add(btn1, BorderLayout.CENTER);
			centerPanel.add(btn2, BorderLayout.SOUTH);		
			
			
			add(centerPanel);			
		}
		
		if(centerPanel != null){
			centerPanel.revalidate();
			centerPanel.repaint();
			
			tabPane.revalidate();
		}
		
	}


	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		_setLayout(1);
		
	}

	
}
```


----------



## sheddy (2. Mrz 2014)

Gibt es die Möglichkeit nur eine bestimmte Komponente zu löschen und nicht alles (removeall)?


----------



## sheddy (2. Mrz 2014)

Problem gelöst: Ich habe nur den Inhalt des centerPanels gelöscht und es erneut hinzugefügt. Ich denke mal, die beiden centerPanels haben sich überlagert, so dass es dort zu Problemen kam. 

Habe es so gelöst, dass ich beim Hinzufügen statt add(component) nun add(component, index) verwende und dann gezielt mit dem index das Panel anspreche.


----------

