Implementing back/forward buttons in Swing

后端 未结 3 654
生来不讨喜
生来不讨喜 2020-11-22 01:00

I have a quick question.

I\'m getting a little bit of experience with Swing and the easiest way to do this was to draw up a reasonably big GUI.

As part of t

相关标签:
3条回答
  • 2020-11-22 01:43

    The way I usually do it is as follows:

    1. I've got a StepManager class (write it once, use it forever) which handles all logic related to the steps. It got methods like next(), previous(), reset(), isFirst() and isLast().

    2. I've then got 'Next' and 'Previous' buttons with appropriate actions (or whatever you choose to use to listen for user interaction).

    3. The code related to the 'Next' button calls stepManager.next() to retrieve the index for the next step. Then (when I've got the next step) I simply invoke (another method) showStep(int index) to display the actual step user interface corresponding to the current step index.

    Each step is a separate JPanel (Step01, Step02, Step03...).

    public void showStep(int index) {
        ContentPanel.removeAll();
        ContentPanel.setLayout(new BorderLayout());
    
        switch (index) {
            case 0:
                ContentPanel.add(Step01, BorderLayout.CENTER);
                break;
    
            case 1:
                ContentPanel.add(Step02, BorderLayout.CENTER);
                break;
    
            case 2:
                ContentPanel.add(Step03, BorderLayout.CENTER);
                break;
    
            case 3:
                ContentPanel.add(Step04, BorderLayout.CENTER);
    
            }
    
        ContentPanel.validate();
        ContentPanel.repaint();
    }
    
    0 讨论(0)
  • 2020-11-22 01:57

    Here's an example using CardLayout.

    enter image description here

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.util.Random;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    /** @see http://stackoverflow.com/questions/5654926 */
    public class CardPanel extends JPanel {
    
        private static final Random random = new Random();
        private static final JPanel cards = new JPanel(new CardLayout());
        private final String name;
    
        public CardPanel(String name) {
            this.name = name;
            this.setPreferredSize(new Dimension(320, 240));
            this.setBackground(new Color(random.nextInt()));
            this.add(new JLabel(name));
        }
    
        @Override
        public String toString() {
            return name;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    create();
                }
            });
        }
    
        private static void create() {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            for (int i = 1; i < 9; i++) {
                CardPanel p = new CardPanel("Panel " + String.valueOf(i));
                cards.add(p, p.toString());
            }
            JPanel control = new JPanel();
            control.add(new JButton(new AbstractAction("\u22b2Prev") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    CardLayout cl = (CardLayout) cards.getLayout();
                    cl.previous(cards);
                }
            }));
            control.add(new JButton(new AbstractAction("Next\u22b3") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    CardLayout cl = (CardLayout) cards.getLayout();
                    cl.next(cards);
                }
            }));
            f.add(cards, BorderLayout.CENTER);
            f.add(control, BorderLayout.SOUTH);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:57

    the idea of making whatever I get reusable is a good one. Pity Swing didn't have this functionality built in though

    Check out Card Layout Actions which is may attempt at making the Card Layout a little easier to use for something like this.

    0 讨论(0)
提交回复
热议问题