2013-04-03 65 views
0

所以我有一个带CardLayout的JPanel。如预期的那样,此CardLayout管理帧中面板的切换。 切换由两个按钮完成:“返回”和“下一步”。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 
       } 
     } 
} 
+1

在“下一个”按钮的处理程序中,如果当前卡是最后一个,则调用exit()(或者在帧上处理())​​。不知道你在哪里遇到麻烦 - 这真的很简单。 – 2013-04-03 23:15:40

+0

@ ErnestFriedman-Hill问题是:我不知道如何检查哪一个是最后一个。我看到了一个方法.last(),但是这个方法放出了最后一张牌,并且不返回任何东西(也许与我认为最后一张牌相比)。 – Yokhen 2013-04-03 23:19:32

回答

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 

例如:

enter image description here

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(); 
      } 
     }); 
    } 
} 
+0

@Yokhen我更新了我的答案。 – 2013-04-03 23:50:57

+0

谢谢。这就是我最终所做的。有我的upvote。 – Yokhen 2013-04-04 00:03:14

0

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

+0

很抱歉,我编辑了这个问题,因为看起来你没有得到我所问的内容。 – Yokhen 2013-04-03 23:20:41

2

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

+0

是的,我一直在使用它,直到我发现“下一个(Container parent)”,但是后来我发现了这个问题。所以我想如果没有其他方法检查它是否在最后一个,我会回去这样做。 – Yokhen 2013-04-03 23:25:45

+1

'CardLayout'保留了哪张卡的详细信息,因此您将不得不管理导航索引信息。数组方法更易于维护。 – Reimeus 2013-04-03 23:28:47

+0

感谢关键信息 – Yokhen 2013-04-04 00:03:36

3

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

+0

现在,这是我想知道为什么它不是标准API的一部分。 – Yokhen 2013-04-05 07:52:19

相关问题