【问题标题】:Allow Textfield Inputs to be converted into a button允许将文本字段输入转换为按钮
【发布时间】:2021-05-25 03:19:49
【问题描述】:

我目前正在尝试开发一个志愿者应用程序,管理员可以在其中将志愿者的姓名添加到文本字段中,并在每次管理员输入姓名时将此输入转换为一个新按钮。我是 GUI 开发的新手,那我该怎么做呢?我尝试将输入作为字符串传递给方法,但我不确定如何使用这种设计创建多个按钮。

【问题讨论】:

    标签: java swing user-interface jbutton jtextfield


    【解决方案1】:

    定义 UI 元素

    首先检查您需要什么来快速实施。

    • 您需要一个用于文本字段的面板,我选择了一个按钮来输入当前文本字段输入。
    • 您还需要一个用于添加通用按钮的面板
    • 为方便起见,我还添加了一个按钮列表,因为您可能打算稍后使用这些按钮执行某些操作,因此需要访问
    // UI elements to type in input and create buttons
    private JPanel inputPanel = new JPanel();
    private JTextField textField = new JTextField();
    private JButton addGenericButtonBtn = new JButton( "ADD NEW BUTTON" );
    
    // UI elements to put your generic buttons into
    private JPanel genericButtonsPanel;
    private List<JButton> buttonList = new ArrayList<>();
    

    创建布局

    您可能需要布局和按钮样式,例如至少可能需要为按钮设置大小,但我不会在此处发布该特定代码。我选择的布局将您的文本字段和用于创建通用按钮的按钮水平放置,并且通用按钮将垂直堆叠在下面的容器中:

    inputPanel.setLayout( new BoxLayout( inputPanel, BoxLayout.X_AXIS ) );
    genericButtonsPanel.setLayout( new BoxLayout( genericButtonsPanel, BoxLayout.Y_AXIS ) );
    

    将您的元素添加到当前的 UI 元素层次结构中

    这些面板必须添加到您正在使用的父容器中。假设parentContainerJPanel 并且您想将所有这些元素添加到:

    parentContainer.inputPanel.add( textField );
    parentContainer.inputPanel.add( addGenericButtonBtn );
    parentContainer.add( inputPanel );
    parentContainer.add( genericButtonsPanel );
    

    通过ActionListener 添加通用按钮

    这种设计方式是让您可以在文本字段中键入内容,然后按“添加新按钮”按钮以创建通用按钮并将它们添加到第二个容器genericButtonsPanel。所以剩下的就是addGenericButtonsBtn 的动作监听器来完成这个:

    addGenericButtonBtn.addActionListener( e -> 
    {
        String txt = textField.getText();
        JButton genericBtn = new JButton( txt );
        buttonList.add( genericBtn ); // this is merely to store the generated buttons for future access
        genericButtonsPanel.add( genericBtn );
        text.setText( "" ); // optional clear of the text field
    
        // this call is mandatory, otherwise the changes to the hierarchy of UI elements will not be reflected
        revalidate();
    }); 
    

    进一步阅读

    这是一个非常简约的示例,可以满足您描述的要求。这刚刚在我的机器上进行了测试,并按预期工作。还有无数种方法可以解决这个问题,因此您可能会看到一些不同的解决方案。

    所提供的解决方案缺少细节,例如setSizesetBackgroundsetBorder 和其他 UI 属性设置器,因此您必须按照自己需要的方式设置 UI 样式。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多