Hallo zusammen
Ich erstelle zur Zeit das GUI für eine Applikation, die als breiter Streifen im unteren Teil des Bildschirms verschiedene Funktionalitäten zur Verfügung stellt.
Bei manchen Buttons soll ein Panel nach oben "ausklappen" - bzw. bei erneutem Klick wieder einklappen. Das GUI ändert also auf Knopfdruck die Grösse - der untere Bereich bleibt aber immer gleich.
Gelöst habe ich es so, dass das GUI ein BorderLayout hat und sich im Norden das "extendedPanel" befindet - mit der Höhe 0. Wenn ein Button gedrückt wird, wird die Höhe des Panels gesetzt und das JFrame entsprechend neu platziert.
Das Problem: beim Auf- und Zuklappen flackert es und ich habe noch keine Lösung gefunden, wie ich dieses Flackern beseitigen kann.
Zur Veranschaulichung habe ich ein kleines Programm geschrieben, welches das wesentliche Problem aufzeigt. Bei schnellem Klicken auf "Switch" sieht man, dass der rote Bereich beim "einklappen" oft kurz über dem blauen Bereich "hängt", bzw. es sieht so aus als ob es zuerst nach unten verschoben und dann eingeklappt werden würde. Es passiert nicht immer, aber immer wieder.
Was könnte ich da anders machen? Gibt es vielleicht einen grundsätzlich besseren Weg diese Anforderung umzusetzen?
Ich erstelle zur Zeit das GUI für eine Applikation, die als breiter Streifen im unteren Teil des Bildschirms verschiedene Funktionalitäten zur Verfügung stellt.
Bei manchen Buttons soll ein Panel nach oben "ausklappen" - bzw. bei erneutem Klick wieder einklappen. Das GUI ändert also auf Knopfdruck die Grösse - der untere Bereich bleibt aber immer gleich.
Gelöst habe ich es so, dass das GUI ein BorderLayout hat und sich im Norden das "extendedPanel" befindet - mit der Höhe 0. Wenn ein Button gedrückt wird, wird die Höhe des Panels gesetzt und das JFrame entsprechend neu platziert.
Das Problem: beim Auf- und Zuklappen flackert es und ich habe noch keine Lösung gefunden, wie ich dieses Flackern beseitigen kann.
Zur Veranschaulichung habe ich ein kleines Programm geschrieben, welches das wesentliche Problem aufzeigt. Bei schnellem Klicken auf "Switch" sieht man, dass der rote Bereich beim "einklappen" oft kurz über dem blauen Bereich "hängt", bzw. es sieht so aus als ob es zuerst nach unten verschoben und dann eingeklappt werden würde. Es passiert nicht immer, aber immer wieder.
Was könnte ich da anders machen? Gibt es vielleicht einen grundsätzlich besseren Weg diese Anforderung umzusetzen?
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GuiSwitcherTest extends JFrame {
private JPanel upperPanel = new JPanel();
private JPanel centerPanel = new JPanel();
private final int WIDTH = 450;
private final int UPPER_HEIGHT = 200;
private final int CENTER_HEIGHT = 300;
private Dimension nullHeight = new Dimension(WIDTH, 0);
private Dimension centerSize = new Dimension(WIDTH, CENTER_HEIGHT);
private Dimension upperSize = new Dimension(WIDTH, UPPER_HEIGHT);
public GuiSwitcherTest() {
this.setLayout(new BorderLayout());
this.setLocation(250, 400);
this.setSize(centerSize);
upperPanel.setBackground(Color.red);
centerPanel.setBackground(Color.blue);
centerPanel.setPreferredSize(centerSize);
upperPanel.setPreferredSize(nullHeight);
JButton switchButton = new JButton("switch");
switchButton.setPreferredSize(new Dimension(80, 25));
centerPanel.setLayout(null);
switchButton.setBounds(80, 80, 80, 25);
centerPanel.add(switchButton, BorderLayout.CENTER);
switchButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
switchGui();
}
});
this.add(centerPanel, BorderLayout.CENTER);
this.add(upperPanel, BorderLayout.NORTH);
}
private void switchGui() {
if (upperPanel.getHeight() == 0) {
upperPanel.setPreferredSize(upperSize);
this.setLocation(getLocation().x, getLocation().y - UPPER_HEIGHT);
} else {
upperPanel.setPreferredSize(nullHeight);
this.setLocation(getLocation().x, getLocation().y + UPPER_HEIGHT);
}
pack();
repaint();
}
public static void main(String args[]) {
new GuiSwitcherTest().setVisible(true);
}
}