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?!
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?!
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.
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)".
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 :/
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
Java:
publicclassMain{publicMain(){// TODO Auto-generated constructor stub}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewHauptfenster();}}
Hauptfenster
Java:
importjava.awt.Dimension;importjava.awt.Toolkit;importjavax.swing.JFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JTabbedPane;publicclassHauptfensterextendsJFrame{publicHauptfenster(){super("Test");setSize(1000,700);// groesse des fenstersetMinimumSize(getSize());setDefaultCloseOperation(EXIT_ON_CLOSE);setResizable(true);this.setVisible(true);// macht alle fenster sichtbar// Menü-LeisteJMenuBar menu =newJMenuBar();// Auswahl-Menü: DateiJMenu file =newJMenu("Datei");// Datei > NeuJMenu _new =newJMenu("Neu");// Datei > Neu > EhrenscheibeJMenuItem tab =newJMenuItem("Tab");// Auswahlmenüs zur Leiste hinzufügen
menu.add(file);
_new.add(tab);
file.add(_new);setJMenuBar(menu);JTabbedPane tabPane =newJTabbedPane();// tabbedPane zum Fenster hinzufügenadd(tabPane);
tab.addActionListener(newTabEvent(tabPane));}}
TabEvent
Java:
importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JPanel;importjavax.swing.JTabbedPane;publicclassTabEventimplementsActionListener{privateJTabbedPane pane;publicTabEvent(JTabbedPane pane){// TODO Auto-generated constructor stubthis.pane = pane;}@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stub
pane.addTab("asas",newTabPanel(pane));}}
TabPanel
Java:
importjava.awt.BorderLayout;importjava.awt.Button;importjava.awt.Dimension;importjava.awt.FlowLayout;importjava.awt.GridBagLayout;importjava.awt.LayoutManager;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JList;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTabbedPane;publicclassTabPanelextendsJPanelimplementsActionListener{privateJPanel centerPanel =null;privateJTabbedPane tabPane =null;publicTabPanel(JTabbedPane tabPane){// TODO Auto-generated constructor stubthis.tabPane = tabPane;setLayout(newBorderLayout());// Liste linksJPanel listPanel =newJPanel(newBorderLayout());JList list =newJList();JScrollPane scroller =newJScrollPane(list,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroller.setPreferredSize(newDimension(250,0));
listPanel.add(list,BorderLayout.CENTER);add(scroller,BorderLayout.WEST);_setLayout(0);}privatevoid_setLayout(int type){if(centerPanel !=null){
centerPanel.removeAll();
centerPanel =null;}// Mitte des Tabsif(type ==0){
centerPanel =newJPanel(newGridBagLayout());JButton btn =newJButton("Nummer 1");
btn.addActionListener(this);
centerPanel.add(btn);add(centerPanel);}else{
centerPanel =newJPanel(newBorderLayout());JButton btn1 =newJButton("Nummer 1");JButton btn2 =newJButton("Nummer 2");
centerPanel.add(btn1,BorderLayout.CENTER);
centerPanel.add(btn2,BorderLayout.SOUTH);add(centerPanel);}if(centerPanel !=null){
centerPanel.revalidate();
centerPanel.repaint();
tabPane.revalidate();}}@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stub_setLayout(1);}}
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.