Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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:
public class Main {
public Main() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Hauptfenster();
}
}
Hauptfenster
Java:
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
Java:
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
Java:
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);
}
}
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.