【问题标题】:(Card Layout) Setting Card Name of CardPanels for JComboBox(卡片布局)为JComboBox设置CardPanels的卡片名称
【发布时间】:2016-06-26 18:11:57
【问题描述】:

伙计们。我的项目设计结合了硬编码设计和使用 Netbeans 的 GUI Builder 进行的设计。由于进度落后,我决定使用 GUI Builder 进行 RAD 和快速设计。

所以我的问题是如何在为面板使用卡片布局时为卡片面板分配名称。我知道如果不使用 GUI Builder,您可以简单地编写 cardContainerPanel.add(card1Panel,"card1")。 card1 作为 card1Panel 的 String 标识符。但我想做的是将String variable 作为卡名传递。

喜欢,

String card1 = "card1";

那么
cardContainerPanel.add(card1Panel, card1)

1.) 我如何在 Netbeans GUI Builder 上使用面板的 Properties 选项执行此操作,因为它只将您在 Card Name 上键入的内容作为字符串

我需要在 JComboBox 的 itemChange 事件期间切换到不同的卡片。

这是我到目前为止所写的。

private void settingsComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {                                                  
        CardLayout cl = (CardLayout)(cardContainerPanel.getLayout());
        cl.show(cardContainerPanel, (String)evt.getItem());
    }                                                 

    private void loadSettingsComboxBoxModel(){
        String HOME = "Home";
        String ADMIN = "Administration";
        String ADMIN_CURC = "Administration > Curriculum";
        String ADMIN_DISCOUNTS = "Administration > Discounts";
        String ADMIN_SECTIONS = "Administration > Sections";
        String ADMIN_USERS = "Administration > Users";
        String ADMIN_SCHED = "Administration > Schedule";
        String ADMIN_YRLEVEL = "Administration > Year Level";
        String PAYMENT = "Payment";
        String REGISTRATION = "Registration";
        String STUDENTS = "Students";
        String FACULTY = "Faculty";
        String REPORTS = "Reports";
        String SECTIONS = "Sections";

        String settingsComboBoxItems[] = 
            {HOME,ADMIN,ADMIN_CURC,ADMIN_DISCOUNTS,
                ADMIN_SECTIONS,ADMIN_USERS,ADMIN_SCHED,
                ADMIN_YRLEVEL,PAYMENT,REGISTRATION,STUDENTS,FACULTY,REPORTS,SECTIONS};
        DefaultComboBoxModel dcm = new DefaultComboBoxModel(settingsComboBoxItems);
        settingsComboBox.setModel(dcm); 
    }

如果有任何帮助,我将不胜感激。

谢谢。

【问题讨论】:

    标签: java swing layout jcombobox cardlayout


    【解决方案1】:

    在 IDE 中硬编码卡的名称是无关紧要的。

    相关的是当您想要交换卡片时使用的卡片名称。在这种情况下,您没有理由不能使用变量来指定要交换到的卡名称。

    实际上,您似乎正在使用组合框来选择要显示的卡片。因此,您需要做的就是确保卡片名称与组合框中显示的值相同。

    然后在您的 ItemListener 中,您只需使用以下内容交换卡片:

    cardLayout.show(cards, (String)evt.getItem());
    

    请参阅 How to Use CardLayout 上的 Swing 教程部分以获取工作示例。

    【讨论】:

    • 感谢您的回复。是的,我实际上去了 oracle.com 页面,了解“如何使用卡片布局”,但是我如何仅使用 GUI Builder 来告诉特定的组合框模型项它与哪个面板绑定。我可以简单地使用 cardLayout.show(cards, (String)evt.getItem());但我无法将组合框中的项目绑定到它必须显示的面板。
    • 你刚才说可以在IDE中输入“homeCard”。因此,您还需要在组合框中有“homeCard”。但是,根据您发布的代码,卡名称应为“主页”,与组合框中显示的值相同。第二张卡片名称应为“Administration”。
    • 感谢您的信息。我能够解决它,但使用了另一种方法,即使用 addLayoutComponent(cardPanelToShow,stringVariable); cl.show(cardContainerPanel, (String)evt.getItem());
    • 我猜你的解决方案更简单,代码更少。谢谢。我很感激。我将使用 addLayoutComponent() 编辑我的帖子以帮助其他人。
    【解决方案2】:

    我能够使用addLayoutComponent() 方法解决它,该方法将面板添加到卡片布局对象并接受字符串变量作为其第二个参数。

            String HOME = "Home";
            String ADMIN = "Administration";
            String ADMIN_CURC = "Administration > Curriculum";
            String ADMIN_DISCOUNTS = "Administration > Discounts";
            String ADMIN_SECTIONS = "Administration > Sections";
            String ADMIN_USERS = "Administration > Users";
            String ADMIN_SCHED = "Administration > Schedule";
            String ADMIN_YRLEVEL = "Administration > Year Level";
            String PAYMENT = "Payment";
            String REGISTRATION = "Registration";
            String STUDENTS = "Students";
            String FACULTY = "Faculty";
            String REPORTS = "Reports";
            String SECTIONS = "Sections";
    
            String settingsComboBoxItems[] = 
                {HOME,ADMIN,ADMIN_CURC,ADMIN_DISCOUNTS,
                    ADMIN_SECTIONS,ADMIN_USERS,ADMIN_SCHED,
                    ADMIN_YRLEVEL,PAYMENT,REGISTRATION,STUDENTS,FACULTY,REPORTS,SECTIONS};
            DefaultComboBoxModel dcm = new DefaultComboBoxModel(settingsComboBoxItems);
    
    //constructor
        public UserManagementGUI() {
                initComponents();
                loadUsersList();
                settingsComboBox.setModel(dcm);
            }
    
    private void settingsComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {                                                  
            CardLayout cl = (CardLayout)(cardContainerPanel.getLayout());
            cl.addLayoutComponent(homePermissionsPanel, HOME);
            cl.addLayoutComponent(administrationPermissionsPanel, ADMIN);
            cl.show(cardContainerPanel, (String)evt.getItem());
        } 
    

    【讨论】:

    • 步骤: 1.) 声明字符串变量来保存卡片标识符。 2.) 将声明的字符串存储到数组中。 3.) 声明一个 DefaulComboBoxModel 对象并传递数组以对其进行初始化 4.) 将组合框的模型设置为保存数组的 DefaultComboBoxModel 对象 5.) 使用 addLayoutComponent() 方法将面板添加到 CardLayout 对象 cl。
    • 不确定设置两个约束的目的是什么。您如何访问其他 15 个面板?为什么每次都设置约束?应在创建面板时分配约束。
    • 别担心,我实际上接受了您的建议,但您知道我只是想也许我可以为模型项名称上不同的每个约束设置一个不同的名称。我知道这有点多余,这就是为什么我仍然接受您的建议,为组合框项目和卡片的(面板)标识符设置相似的名称。
    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 2019-12-24
    • 2011-12-14
    • 2017-11-10
    • 1970-01-01
    • 2021-09-01
    • 2015-05-21
    • 2013-08-07
    相关资源
    最近更新 更多