在java中使用Cardlayout时遇到麻烦

时间:2014-05-04 00:23:17

标签: java swing actionlistener cardlayout pane

麻烦在cardlayout的面板上添加组件,它们看起来很奇怪(非常小和顶部中心),尝试了很多布局但没有得到合适的结果,我必须放置,按钮,分割窗格,选项卡窗格在不同的面板上 这是示例代码。在我现在正在使用的代码上遇到同样的问题

请查看我出错的地方

public static void main(String[] args) {

    CardLayout cards = new CardLayout();
    JPanel cardPanel = new JPanel();
    cardPanel.setLayout(cards);


    JFrame guiFrame = new JFrame();

    //make sure the program exits when the frame closes
    guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    guiFrame.setTitle("Frame");
    guiFrame.setSize(528, 555);

    //This will center the JFrame in the middle of the screen
    guiFrame.setLocationRelativeTo(null);
    guiFrame.setVisible(true);

    JButton B_1 = new JButton("");
    JButton B_2 = new JButton("");


    JPanel firstCard = new JPanel();

    firstCard.add(B_1);

    B_1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            cards.next(cardPanel);
        }
    });


    JPanel secondCard = new JPanel();

    secondCard.add(B_2);

    B_2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            cards.previous(cardPanel);
        }
    });

    cardPanel.add(firstCard);
    cardPanel.add(secondCard);

    guiFrame.add(cardPanel);

}
}

2 个答案:

答案 0 :(得分:2)

您的代码甚至无法编译。

我重新安排了您的代码并添加了以下功能:

  1. 我通过调用SwingUtilities invokeLater启动了GUI。这将Swing GUI置于Event Dispatch thread(EDT)。

  2. 我把代码放在一起(JFrame,JPanel),以便代码更容易理解。

  3. 我在每个卡片面板上放了一个JLabel,这样你就可以看到哪个面板是哪个。

  4. 我把文字放在JButtons中。它们非常小,因为您没有要显示的按钮的文字或标签。

  5. 我将部分JFrame代码移到了方法的末尾。您在Swing GUI中执行的最后一项操作是将框架设置为可见。在使JFrame窗口可见之前,必须构造所有Swing组件。

  6. 这是您尝试编码的卡片布局的经过测试的最小例子。

    import java.awt.CardLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class CardLayoutTest implements Runnable {
    
        @Override
        public void run() {
            JFrame guiFrame = new JFrame();
    
            // make sure the program exits when the frame closes
            guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            guiFrame.setTitle("Frame");
    
            final CardLayout cards = new CardLayout();
            final JPanel cardPanel = new JPanel();
            cardPanel.setLayout(cards);
    
            final JPanel firstCard = new JPanel();
            firstCard.setLayout(new FlowLayout());
    
            JLabel label1 = new JLabel("Panel 1");
            firstCard.add(label1);
    
            JButton b_1 = new JButton("Swap to Panel 2");
            firstCard.add(b_1);
    
            final JPanel secondCard = new JPanel();
            secondCard.setLayout(new FlowLayout());
    
            JLabel label2 = new JLabel("Panel 2");
            secondCard.add(label2);
    
            JButton b_2 = new JButton("Swap to Panel 1");
            secondCard.add(b_2);
    
            b_1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent event) {
                     cards.next(cardPanel);
                }
            });
    
            b_2.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent event) {
                     cards.previous(cardPanel);
                }
            });
    
            cardPanel.add(firstCard, "First Panel");
            cardPanel.add(secondCard, "Second Panel");
    
            guiFrame.add(cardPanel);
            guiFrame.setSize(528, 555);
            // This will center the JFrame in the middle of the screen
            guiFrame.setLocationRelativeTo(null);
            guiFrame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new CardLayoutTest());
        }
    
    }
    

答案 1 :(得分:1)

这就是CarLayout的工作方式,默认情况下,它将对象置于水平中心和垂直顶部。如果未指定添加组件的大小,则会将其调整为可能的最小大小。 配置布局对齐,设置组件的大小或使用其他布局。