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 einem CardLayout.
  • 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
InformationsquelleAutor stephenfin | 2011-04-13
Schreibe einen Kommentar