在Swing中实现后退/前进button

我有一个快速的问题。

我对Swing有一些经验,最简单的方法就是制定一个合理的大GUI。

作为GUI的一部分,我想要有前进和后退button。 我试图采取的方法是实现将当前的JPanel推到堆栈和检索以前的值(是正向或反向(因此2堆栈))的方法。 我不能让它工作。 也许我完全用错误的方式去解决问题,或者也许我不能像使用它的方式一样使用堆栈。 无论如何,这真的是在烦扰我。 我想有可能更简单的方式,如卡布局,但我认为这种方法应该工作,这是如此烦人。

值得一提的是,我正在使用JFrame“基类”,并根据屏幕更改中央JPanel。 然而,导航栏作为“基类”的一部分是不变的

这个“基类”的代码:

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 } 

这是一个使用CardLayout的例子。

在这里输入图像描述

 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); } } 

让我可以重复使用的想法是一个好主意。 Pity Swing没有内置这个function

查看卡布局的行动 ,可能会尝试使卡布局更容易使用这样的事情。

我通常这样做的方式如下:

  1. 我有一个StepManager类(写一次,永远使用它)处理与步骤相关的所有逻辑。 它有像next(),previous(),reset(),isFirst()和isLast()这样的方法。

  2. 然后我有适当的行动(或任何你select用来监听用户交互)的“下一个”和“上一个”button。

  3. 与“Next”button相关的代码调用stepManager.next()来检索下一步的索引。 然后(当我有下一步)我只是调用(另一种方法)showStep(INT索引)显示当前步骤索引对应的实际步骤用户界面。

每个步骤都是一个单独的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(); }