Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Swing中实现后退/前进按钮_Java_Swing_Stack - Fatal编程技术网

Java 在Swing中实现后退/前进按钮

Java 在Swing中实现后退/前进按钮,java,swing,stack,Java,Swing,Stack,我有一个简短的问题 我对Swing有一点经验,最简单的方法是绘制一个相当大的GUI 作为GUI的一部分,我希望有前进和后退按钮。我尝试采用的方法是实现将当前JPanel推送到堆栈并检索以前的值(向前或反向(因此有两个堆栈))的方法。但是我不能让它工作。也许我完全用错了方法,或者堆栈不能用在我使用它的方式中。不管是哪种情况,我都很烦。我想可能有更简单的方法,比如卡片布局,但我认为这种方法应该有效,这就是为什么这么烦人 值得注意的是,我正在使用JFrame“基类”,并根据屏幕的不同更改中心JPane

我有一个简短的问题

我对Swing有一点经验,最简单的方法是绘制一个相当大的GUI

作为GUI的一部分,我希望有前进和后退按钮。我尝试采用的方法是实现将当前JPanel推送到堆栈并检索以前的值(向前或反向(因此有两个堆栈))的方法。但是我不能让它工作。也许我完全用错了方法,或者堆栈不能用在我使用它的方式中。不管是哪种情况,我都很烦。我想可能有更简单的方法,比如卡片布局,但我认为这种方法应该有效,这就是为什么这么烦人

值得注意的是,我正在使用JFrame“基类”,并根据屏幕的不同更改中心JPanel。然而,导航条作为“基类”的一部分是恒定的

此“基类”的代码:

public类主框架扩展了JFrame{
静态JPanel导航条面板;
杰布顿之家;
钮扣背;
按钮向前;
JPanel currentPanel;
静态堆叠面板;
静态堆叠面板;
公共主框架(){
超级(“演示”);
设置大小(800600);
setLayout(新的BorderLayout());
setVisible(真);
添加(导航栏(),BorderLayout.NORTH);
currentPanel=init_display();
添加(currentPanel,BorderLayout.CENTER);
previousPanels=新堆栈();
forwardPanels=新堆栈();
}
私人JPanel导航栏(){
ButtonPressHandler=新建ButtonPressHandler();
导航栏面板=新的JPanel(新的FlowLayout(FlowLayout.LEFT,10,10));
后退=新的按钮(“后退”);
addActionListener(处理程序);
主页=新的JButton(“主页”);
addActionListener(处理程序);
前进=新的按钮(“前进”);
addActionListener(处理程序);
导航栏面板。添加(背面);
导航栏面板。添加(主页);
导航栏面板。添加(前进);
返回导航条面板;
}
私有JPanel init_display(){
主面板主面板=新主面板();
返回主页面板;
}
公共作废更改显示(JPanel myPanel){
使无效();
移除(当前面板);
前面板。推送(当前面板);
currentPanel=myPanel;
添加(当前面板);
验证();
}
公共作废上一次_显示(){
如果(!previousPanels.empty()){
使无效();
移除(当前面板);
向前面板。推动(当前面板);
currentPanel=previousPanels.pop();
添加(当前面板);
验证();
}
}
公共无效前向显示(){
如果(!forwardPanels.empty()){
使无效();
移除(当前面板);
前面板。推送(当前面板);
currentPanel=forwardPanels.pop();
添加(当前面板);
验证();
}
}
私有类ButtonPressHandler实现ActionListener
{
已执行的公共无效操作(操作事件)
{
if(event.getSource()=返回){
上一个_显示();
系统输出打印(“您选择了返回”);
}else if(event.getSource()==forward){
正向显示();
系统输出打印(“您选择了转发”);
}
}//已执行结束方法操作
}//结束私有内部类TextFieldHandler
}

我通常的做法如下:

  • 我有一个StepManager类(编写一次,永远使用),它处理与步骤相关的所有逻辑。它得到了next()、previous()、reset()、isFirst()和isLast()等方法

  • 然后,我有了带有适当操作的“下一步”和“上一步”按钮(或者您选择用于监听用户交互的任何按钮)

  • 与“Next”按钮相关的代码调用stepManager.Next()来检索下一步的索引。然后(当我完成下一步时),我只需调用(另一个方法)showStep(int index)来显示与当前步骤索引对应的实际步骤用户界面

  • 每个步骤都是一个单独的JPanel(步骤01、步骤02、步骤03…)

    下面是一个使用的示例

    导入java.awt.BorderLayout;
    导入java.awt.CardLayout;
    导入java.awt.Color;
    导入java.awt.Dimension;
    导入java.awt.EventQueue;
    导入java.awt.event.ActionEvent;
    导入java.util.Random;
    导入javax.swing.AbstractAction;
    导入javax.swing.JButton;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JPanel;
    /**@见http://stackoverflow.com/questions/5654926 */
    公共类CardPanel扩展了JPanel{
    私有静态最终随机=新随机();
    私有静态最终JPanel卡=新JPanel(新CardLayout());
    私有最终字符串名;
    公共CardPanel(字符串名称){
    this.name=名称;
    此.setPreferredSize(新维度(320240));
    这个.setBackground(新颜色(random.nextInt());
    添加(新JLabel(名称));
    }
    @凌驾
    公共字符串toString(){
    返回名称;
    }
    公共静态void main(字符串[]args){
    invokeLater(新的Runnable(){
    @凌驾
    公开募捐{
    创建();
    }
    });
    }
    私有静态void create(){
    JFrame f=新的JFrame();
    f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    对于(int i=1;i<9;i++){
    CardPanel p=新的CardPanel(“面板”+字符串.valueOf(i));
    添加(p,p.toString());
    }
    JPanel控件=新的JPanel();
    添加(新的JButton(新的抽象操作(“\u22b2Prev”){
    @凌驾
    已执行的公共无效操作(操作事件e){
    卡德拉尤
    
    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
    
    }
    
    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();
    }
    
    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);
        }
    }