0

だから私は CardLayout を持つ JPanel を持っています。この CardLayout は、予想どおり、フレーム内のパネルの切り替えを管理します。切り替えは「戻る」と「次へ」の2つのボタンで行います。

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
                }
        }
}
4

4 に答える 4

3

dispose()から継承されているのは何Windowですか?次のように設定してください。

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();
            }
        });
    }
}
于 2013-04-03T23:11:57.287 に答える
2

問題は、最後のカードを決定することです。カードString配列インデックスを使用して の現在の位置を管理し、showメソッドを使用して次の「カード」を表示できます。カード配列のインデックスを超えると、JFrame.

于 2013-04-03T23:21:01.643 に答える
0

System.exit(0) を実行すると、すべてのアプリケーションが閉じられますが、JFrame のみを閉じる場合は、JFrameObject.dispose() を使用できます。

于 2013-04-03T23:14:39.953 に答える