【问题标题】:switching panels - cardlayout切换面板 - 卡片布局
【发布时间】:2018-04-29 12:01:16
【问题描述】:

我无法通过面板。

这是行:

cardLayout.show( cards, String.valueOf( "EXCEL_PANEL" ) );

我调用了EXCEL_PANEL 的显示方法,但它没有出现。 我觉得这是一个令人眼花缭乱的错误。

我到底想要什么—— 整个程序将运行在同一个框架中,但是我被困了一个星期,我无法意识到同样的问题。

还有一个问题。有谁知道如何通过按下登录按钮来创建一个事件,而不是继续这个块中的其余部分?因为这才刚刚开始,而且很烦人。

这是我的卡片布局类代码:

public class CardLayoutManager {

    JPanel cards;
    final static String LOGIN_PANEL = "Card with Login elements";
    final static String EXCEL_PANEL = "Card with Excel load file element";

    public void addComponentToPane(Container pane) throws IOException {

        LoginPanel login_p = new LoginPanel();
        ExcelPanel excel_p = new ExcelPanel();

        cards = new JPanel( new CardLayout() );
        cards.add( login_p, LOGIN_PANEL );
        cards.add( excel_p, EXCEL_PANEL );

        pane.add( cards, BorderLayout.CENTER );
        CardLayout cardLayout = (CardLayout) (cards.getLayout());
        cardLayout.show( cards, String.valueOf( login_p ) );

        login_p.login_btn.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    boolean identification = login_p.LoginCheck();
                    if (!identification) {
                        JOptionPane.showMessageDialog( login_p, "Sorry, this user does not have access to the system.", "warning", JOptionPane.WARNING_MESSAGE );
                        login_p.ClearFields();
                    } else {
                        cardLayout.show( cards, String.valueOf( "EXCEL_PANEL" ) );
                    }
                } catch (SQLException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        } );
    }

    private static void createAndShowGUI() throws IOException {
        USTCFrame frame = new USTCFrame();
        CardLayoutManager demo = new CardLayoutManager();
        demo.addComponentToPane( frame.getContentPane() );
        frame.setVisible( true );
    }

    public static void main(String[] args) {

        try {
            UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel" );
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        /* Turn off metal's use of bold fonts */
        UIManager.put( "swing.boldMetal", Boolean.FALSE );

        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                try {
                    createAndShowGUI();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } );
    }
}

【问题讨论】:

  • 我的错误是当我尝试用引号写名称时。固定谢谢

标签: java swing panel layout-manager cardlayout


【解决方案1】:

你没有说你的课程USTCFrameLoginPanelExcelPanel 是什么。 所以我假设USTCFrameJFrame 的子类 而LoginPanelExcelPanelJPanel 的子类。

你的台词

cards = new JPanel( new CardLayout() );
cards.add( login_p, LOGIN_PANEL );
cards.add( excel_p, EXCEL_PANEL );

看起来很合理。但是你的台词

 cardLayout.show( cards, String.valueOf( login_p ) );

没有意义。相反,它应该是

cardLayout.show( cards, LOGIN_PANEL );

因为cards.show(...) 的第二个参数应该是 您在cards.add(...) 中使用过的字符串。

出于同样的原因,而不是

cardLayout.show( cards, String.valueOf( "EXCEL_PANEL" ) );

你应该写

cardLayout.show( cards, EXCEL_PANEL );

【讨论】:

  • 类的问题你说得对,USTCFrame 是 JFrame 的子类,LoginPanel 和 ExcelPanel 是 JPanel 的子类。登录打开而 excel 不打开
  • 我的错误是当我尝试用引号写名称时。固定谢谢
  • @saliweizman,不要忘记点击复选标记“接受”答案,这样人们就知道问题已经解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多