【问题标题】:CardLayout to close on last cardCardLayout 在最后一张卡片上关闭
【发布时间】:2013-04-17 19:11:16
【问题描述】:

所以我有一个带有 CardLayout 的 JPanel。 正如预期的那样,此 CardLayout 管理框架中面板的切换。 切换由两个按钮完成:“返回”和“下一步”。

我想知道是否有办法关闭整个应用程序(即调用System.exit(0)),当它位于最后一张卡上并且再次按下“下一步”时。

我到处寻找解决方案,但我找不到任何东西。

问题是:我不知道如何检查哪个是最后一个。

这是我的代码的监听器摘录:

public void actionPerformed(ActionEvent arg0) {
        CardLayout l = (CardLayout) holder.getLayout();
        if(arg0.getSource() == opt[1]){ //opt[1] is the "Next" button


                //Insert if statement here to check if
                //the CardLayout is on the last card
                {
                System.exit(0);
                } else {
                    l.next(holder); //holder is the JPanel with the CardLayout
                }
        }
}

【问题讨论】:

  • 在“下一个”按钮的处理程序中,如果当前卡片是最后一张,则调用 exit()(或框架上的 dispose())。不知道你在哪里遇到了麻烦——真的就是这么简单。
  • @ErnestFriedman-Hill 问题是:我不知道如何检查哪个是最后一个。我看到了一个方法 .last() 但是那个方法列出了最后一张卡片并且没有返回任何东西(也许将它与我认为最后一张卡片进行比较)。

标签: java swing cardlayout


【解决方案1】:

继承自Window 的dispose() 呢? 确保你设置:

jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JFrame frame = ...

// ...

frame.setVisible(false); // hide the GUI
frame.dispose(); // destroy and release the GUI resources

例如:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CardLayoutGUI
{
    private JFrame frame;
    private JButton btnBack;
    private JButton btnNext;
    private CardLayout cLayout;
    private JPanel panUp;
    private JPanel panDown;

    private static final String[] cards =
    {"card1", "card2", "card3", "card4", "card5"}; 

    private int currentCard = 0;

    public void init()
    {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ((JPanel)frame.getContentPane()).setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        btnBack = new JButton("Back");
        btnNext = new JButton("Next");

        btnBack.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                btnNext.setText("Next");
                currentCard--;
                cLayout.show(panUp, cards[currentCard]);
                if(currentCard == 0) btnBack.setVisible(false);
            }
        });

        btnNext.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                btnBack.setVisible(true);
                currentCard++;

                if(currentCard == cards.length - 1) // last card
                {
                    btnNext.setText("Exit");
                    cLayout.show(panUp, cards[currentCard]);
                }
                else if(currentCard >= cards.length)
                {
                    frame.setVisible(false);
                    frame.dispose();
                }
                else
                {
                    cLayout.show(panUp, cards[currentCard]);
                }
            }
        });


        cLayout = new CardLayout();
        panUp = new JPanel(cLayout);
        panDown = new JPanel();
        frame.add(panUp, BorderLayout.CENTER);
        frame.add(panDown, BorderLayout.SOUTH);
        panDown.add(btnBack);
        panDown.add(btnNext);

        for(int i = 0; i < cards.length; i++) createPanels(panUp, cards[i]);

        frame.pack();
        frame.setLocationRelativeTo(null);

        btnBack.setVisible(false);
    }

    public void showGUI()
    {
        frame.setVisible(true);
    }

    private void createPanels(JPanel container, String label)
    {
        JPanel pan = new JPanel();
        pan.add(new JLabel(label));
        container.add(pan, label);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                CardLayoutGUI clg = new CardLayoutGUI();
                clg.init();
                clg.showGUI();
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    我扩展了 CardLayout 以添加一些功能。其中一个功能是isNextCardAvailable() 方法。有关所有功能,请参阅 Card Layout Focus。

    【讨论】:

    • 现在我想知道为什么它不是标准 API 的一部分。
    【解决方案3】:

    问题在于确定哪张卡是最后一张。您可以使用卡片String 数组索引来管理当前位置,并使用show 方法显示下一个“卡片”。当您超过卡片数组索引时,您可以处理您的JFrame。

    【讨论】:

    • 是的,我一直在使用它,直到我发现next(Container parent),但后来我遇到了这个问题。所以我想如果没有其他方法可以检查它是否在最后一个上,我会回去这样做。
    • CardLayout 会自行保存哪张卡的详细信息,因此您必须管理导航索引信息。数组方法更易于维护。
    【解决方案4】:

    如果您运行 System.exit(0),则关闭所有应用程序,但如果您只关闭 JFrame,您可以使用 JFrameObject.dispose()。

    【讨论】:

    • 对不起,我编辑了这个问题,因为您似乎没有得到我的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多