CardLayout出现而没有要求它

时间:2014-06-07 14:47:28

标签: java swing user-interface layout-manager cardlayout

这是我的SSCE(虽然在三个单独的课程中)。

StartUp.java

public class Startup {

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MainFrame gui = new MainFrame();
            }
        });

    }
}

MainFrame.java

package gui;

import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MainFrame {

    private JFrame mainFrame;
    private JMenuBar menuBar;
    private JMenu menuRoboControl;
    private JMenuItem menuItemStart;
    private JMenuItem menuItemShutdown;
    private JPanel cardPanel;
    private final JPanel comListCard = new ComListCard();

    public MainFrame() {
        initComponents();
    }

    private void menuItemStartActionPerformed(ActionEvent e) {
        CardLayout cardLayout = (CardLayout) cardPanel.getLayout();
        cardLayout.show(cardPanel, "selectPort");

    }

    private void menuItemShutdownActionPerformed(ActionEvent e) {
        mainFrame.dispose();
        System.exit(0);
    }

    private void initComponents() {
        mainFrame = new JFrame();
        menuBar = new JMenuBar();
        menuRoboControl = new JMenu();
        menuItemStart = new JMenuItem();
        menuItemShutdown = new JMenuItem();
        cardPanel = new JPanel();

        //======== mainFrame ========
        {
            Container mainFrameContentPane = mainFrame.getContentPane();
            mainFrameContentPane.setLayout(new BoxLayout(mainFrameContentPane, BoxLayout.X_AXIS));
            mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

            //======== menuBar ========
            {

                //======== menuRoboControl ========
                {
                    menuRoboControl.setText("RoboControl");

                    //---- menuItemStart ----
                    menuItemStart.setText("Start Robot");
                    menuItemStart.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            menuItemStartActionPerformed(e);
                        }
                    });
                    menuRoboControl.add(menuItemStart);

                    //---- menuItemShutdown ----
                    menuItemShutdown.setText("Shutdown Robot");
                    menuItemShutdown.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            menuItemShutdownActionPerformed(e);
                        }
                    });
                    menuRoboControl.add(menuItemShutdown);
                }
                menuBar.add(menuRoboControl);
            }
            mainFrame.setJMenuBar(menuBar);

            //======== cardPanel ========
            {
                cardPanel.setLayout(new CardLayout());
                cardPanel.add(comListCard, "selectPort");
            }

            mainFrameContentPane.add(cardPanel);
            mainFrame.setSize(835, 635);
            mainFrame.setLocationRelativeTo(null);
            mainFrame.setVisible(true);
        }
    }
}

ComListCard.java

package gui;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ComListCard extends JPanel {

    private JTextArea portInfo;
    private JScrollPane scrollPane1;
    private JList<String> portList;
    private JButton selectPort;

    public ComListCard() {
        initComponents();
    }

    public void initComponents() {
        portInfo = new JTextArea();
        scrollPane1 = new JScrollPane();
        portList = new JList<>();
        selectPort = new JButton();

        //======== comListCard ========
        {
            this.setLayout(new GridBagLayout());
            ((GridBagLayout) this.getLayout()).columnWidths = new int[]{298, 214, 0, 0};
            ((GridBagLayout) this.getLayout()).rowHeights = new int[]{0, 0, 0, 0, 86, 220, 0, 0, 0};
            ((GridBagLayout) this.getLayout()).columnWeights = new double[]{0.0, 0.0, 1.0, 1.0E-4};
            ((GridBagLayout) this.getLayout()).rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0E-4};

            //---- portInfo ----
            portInfo.setText("Select the port connected to your XBee. If you do not know what port it is connected to, check your Device Manager.");
            portInfo.setLineWrap(true);
            portInfo.setWrapStyleWord(true);
            portInfo.setOpaque(false);
            portInfo.setEnabled(false);
            portInfo.setEditable(false);
            portInfo.setBorder(null);
            this.add(portInfo, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0,
                    GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                    new Insets(0, 0, 5, 5), 0, 0));

            //======== scrollPane1 ========
            {

                //---- portList ----
                portList.setModel(new AbstractListModel<String>() {
                    String[] values = {
                        "1",
                        "2",
                        "3",
                        "4"
                    };

                    @Override
                    public int getSize() {
                        return values.length;
                    }

                    @Override
                    public String getElementAt(int i) {
                        return values[i];
                    }
                });
                scrollPane1.setViewportView(portList);
            }
            this.add(scrollPane1, new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0,
                    GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                    new Insets(0, 0, 5, 5), 0, 0));

            //---- selectPort ----
            selectPort.setText("Select");
            this.add(selectPort, new GridBagConstraints(1, 6, 1, 1, 0.0, 0.0,
                    GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                    new Insets(0, 0, 5, 5), 0, 0));
        }
    }
}

现在有关此问题的一些信息。 GUI工作正常,纯粹关于CardLayout。正如你所看到的,我创建了一个主窗口,里面有一个JPanel作为卡的持有者。我创建了一张卡片并将其添加到CardLayout中。但它已经从程序开始出现,而它应该只在按下按钮后出现(指我放置.show(..)的actionlistener。

任何帮助表示赞赏。也不匆忙。

1 个答案:

答案 0 :(得分:2)

CardLayout用于“保持”多张卡片(面板),但一次只能显示一张卡片。关键是始终显示“一个”面板。所以CardLayout运行正常。

如果您的应用程序需要在框架上动态显示面板,则必须在运行时添加面板。在这种情况下,基本逻辑将是:

panel.add(...);
panel.revalidate();
panel.repaint();

使用上述方法,当最初显示框架时,面板框架上不会保留空间(因此您可能还需要打包()框架以确保面板可见)。

如果您确实希望在显示框架时看到卡面板的空白区域,那么您只需创建一个没有添加任何组件的面板,然后将此面板添加到您的CardLayout。然后,当您调用show()方法时,您将使用组件交换面板。