Implementierung der zurück - /vorwärts-buttons in Swing
Ich habe eine kurze Frage.
Ich bin immer ein wenig Erfahrung mit Swing und der einfachste Weg, dies zu tun war, zu zeichnen, bis eine vernünftig große GUI.
Als Teil der GUI, ich will Vorwärts und Zurück-Schaltflächen. Der Ansatz, den ich versuche zu nehmen, ist die Implementierung von Methoden, schieben Sie das aktuelle JPanel auf einem Stapel und ruft den vorherigen Wert (in einer vorwärts-oder Rückwärtsrichtung (also 2 Stapel)). Ich kann es nicht zu funktionieren obwohl. Vielleicht werde ich darüber völlig die falsche Art und Weise oder vielleicht ein Stapel kann nicht verwendet werden int die Art, wie ich bin, es zu benutzen. In jedem Fall, es ist wirklich nervt mich. Ich vorstellen, es gibt wahrscheinlich einfachere Wege, wie ein Karten-layout, aber ich denke dieser Ansatz sollte funktionieren, und das ist es, was nervt.
Kann es sein, erwähnenswert, dass ich mit einem JFrame "Basis-Klasse" und die änderung der zentralen JPanel je auf dem Bildschirm. Die nav-Leiste konstant ist, als ein Teil der "Basis-Klasse" jedoch
Den code von dieser "Basis-Klasse":
public class Main_Frame extends JFrame{
static JPanel nav_bar_panel;
JButton home;
JButton back;
JButton forward;
JPanel currentPanel;
static Stack<JPanel> previousPanels;
static Stack<JPanel> forwardPanels;
public Main_Frame(){
super("DEMO");
setSize(800,600);
setLayout(new BorderLayout());
setVisible(true);
add(nav_bar(), BorderLayout.NORTH);
currentPanel = init_display();
add(currentPanel, BorderLayout.CENTER);
previousPanels = new Stack<JPanel>();
forwardPanels = new Stack<JPanel>();
}
private JPanel nav_bar(){
ButtonPressHandler handler = new ButtonPressHandler();
nav_bar_panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10));
back = new JButton("Back");
back.addActionListener(handler);
home = new JButton("Home");
home.addActionListener(handler);
forward = new JButton("Forward");
forward.addActionListener(handler);
nav_bar_panel.add(back);
nav_bar_panel.add(home);
nav_bar_panel.add(forward);
return nav_bar_panel;
}
private JPanel init_display(){
Home_Panel home_panel = new Home_Panel();
return home_panel;
}
public void change_display(JPanel myPanel){
invalidate();
remove(currentPanel);
previousPanels.push(currentPanel);
currentPanel = myPanel;
add(currentPanel);
validate();
}
public void previous_display(){
if(!previousPanels.empty()){
invalidate();
remove(currentPanel);
forwardPanels.push(currentPanel);
currentPanel = previousPanels.pop();
add(currentPanel);
validate();
}
}
public void forward_display(){
if(!forwardPanels.empty()){
invalidate();
remove(currentPanel);
previousPanels.push(currentPanel);
currentPanel = forwardPanels.pop();
add(currentPanel);
validate();
}
}
private class ButtonPressHandler implements ActionListener
{
public void actionPerformed( ActionEvent event )
{
if(event.getSource() == back){
previous_display();
System.out.print("You selected back");
} else if(event.getSource() == forward){
forward_display();
System.out.print("You selected forward");
}
} //end method actionPerformed
} //end private inner class TextFieldHandler
}
- Was ist falsch mit
CardLayout
? - Anstelle der Verwendung von zwei stacks, warum nicht ein
List
mit allen Platten? Pflegen Sie ein index zeigt auf das panel derzeit gezeigt wird. Wenn der index 0 ist, dann gibt es keine vorherigen Platten. Wenn es ist size() - 1 dann gibt es kein Nächstes panels. Dies ist natürlich vorausgesetzt, Sie wollen, erstellen Sie Ihre eigene Lösung statt mit einemCardLayout
. - Klingt gut, Jonas. Ich werde wahrscheinlich auch wechseln zu cardlayout sobald ich dieses bekommen werde. Ich konnte nicht ruhen in dem wissen, dass ich konnte nicht herausfinden, obwohl 😀
- Ich glaube nicht, dass das funktionieren würde, weil es unter der Annahme einer konstant linearen Abfolge der Bildschirm ändert sich, aber je nachdem, auf keine links in der GUI, die Sie vielleicht in der Lage sein zu gehen in Schleifen und Kreisen, bevor Sie auf dem Bildschirm, und wenn ich eine Schaltfläche "Zurück" und ich erwarte, dass Sie Folgen Sie den gleichen Weg, da ich vermutlich folgte Ihr mich für einen guten Grund.
- Yep, ich kam zu dem gleichen Schluss. Sie können nicht mit beiden Richtungen, leider
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel für die Verwendung
CardLayout
.setPreferredSize()
verwendet, für Demo-Zwecke nur.cl.previous(cards);
ich legteSystem.out.println("card name: " + (cards.getName()));
aber es gibt null zurück. Wie auf diese?JPanel
hinzufügenname
, aberComponent::getName
istnull
bis Sie aufrufensetName()
.Check-out Karte Layout-Aktionen, die versuchen zu machen, das Karten-Layout ein wenig einfacher zu benutzen für so etwas.
Die Art, wie ich normalerweise tun, ist es wie folgt:
Habe ich eine StepManager Klasse (schreiben Sie es einmal und verwenden es immer) behandelt alle Logik zu den Schritten. Er habe Methoden wie next(), previous(), reset(), isFirst() und isLast().
Habe ich bekam dann 'Next' und 'Previous' - buttons mit entsprechenden Aktionen (oder was auch immer Sie wählen, zu verwenden, um listen für Benutzer-Interaktion).
Den code für den button 'Weiter' ruft stepManager.next() zum abrufen der index für den nächsten Schritt. Dann (Wann habe ich den nächsten Schritt), die ich einfach aufrufen (eine andere Methode) showStep(int index), um den aktuellen Schritt Benutzeroberfläche entspricht dem aktuellen Schritt index.
Jeder Schritt ist ein separates JPanel (Step01, Step02, Step03...).