java - 我想通过单击添加按钮动态添加 JLabel 和文本框

标签 java swing layout

当我动态创建文本和标签框时,它应该采用“文本框:标签框”的格式,然后当我再次单击添加按钮时,相同的模式应该在下一行重复,依此类推...我应该使用哪种布局使用以及如何使用?

这是我使用的代码

if(field_name.getText().equals("")){  
            error.setForeground(Color.red);    
            error.setText("Enter the Field name first");
        } else {  
        JLabel l = new JLabel(field_name.getText(), JLabel.RIGHT);   
        JTextField textField = new JTextField();  
        Dimension dim = new Dimension(20,30);  
        textField.setPreferredSize(dim);  
        field_layer.add(l);  
        field_layer.add(textField);  
        SpringUtilities.makeCompactGrid(field_layer,  
                                numPairs, 2, //rows, cols  
                                6, 6,        //initX, initY  
                                6, 6);       //xPad, yPad  
        numPairs++;  
        field_layer.invalidate();  
        this.pack();  
        }  

最佳答案

一个选项是 GridBagLayout .为了正确使用此布局,您需要了解 GridBagConstraints .这是一个 tutorial帮助您入门。

这是一个简单的例子:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class MyExample 
{
    // Field members
    static JPanel panel = new JPanel();
    static Integer indexer = 1;
    static List<JLabel> listOfLabels = new ArrayList<JLabel>();
    static List<JTextField> listOfTextFields = new ArrayList<JTextField>();

    public static void main(String[] args)
    {       
        // Construct frame
        JFrame frame = new JFrame();
        frame.setLayout(new GridBagLayout());
        frame.setPreferredSize(new Dimension(300, 300));
        frame.setTitle("My Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Frame constraints
        GridBagConstraints frameConstraints = new GridBagConstraints();

        // Construct button
        JButton addButton = new JButton("Add");
        addButton.addActionListener(new ButtonListener());

        // Add button to frame
        frameConstraints.gridx = 0;
        frameConstraints.gridy = 0;
        frame.add(addButton, frameConstraints);

        // Construct panel
        panel.setPreferredSize(new Dimension(200, 200));
        panel.setLayout(new GridBagLayout());
        panel.setBorder(LineBorder.createBlackLineBorder());

        // Add panel to frame
        frameConstraints.gridx = 0;
        frameConstraints.gridy = 1;
        frameConstraints.weighty = 1;
        frame.add(panel, frameConstraints);

        // Pack frame
        frame.pack();

        // Make frame visible
        frame.setVisible(true);
    }

    static class ButtonListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent arg0) 
        {       
            // Clear panel
            panel.removeAll();

            // Create label and text field
            listOfTextFields.add(new JTextField());
            listOfLabels.add(new JLabel("Label " + indexer));

            // Create constraints
            GridBagConstraints textFieldConstraints = new GridBagConstraints();
            GridBagConstraints labelConstraints = new GridBagConstraints();

            // Add labels and text fields
            for(int i = 0; i < indexer; i++)
            {
                // Text field constraints
                textFieldConstraints.gridx = 0;
                textFieldConstraints.gridy = i;

                // Label constraints
                labelConstraints.gridx = 1;
                labelConstraints.gridy = i;

                // Add them to panel
                panel.add(listOfTextFields.get(i), textFieldConstraints);
                panel.add(listOfLabels.get(i), labelConstraints);
            }

            // Align components top-to-bottom
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = 0;
            c.gridy = indexer;
            c.weighty = 1;
            panel.add(new JLabel(), c);

            // Increment indexer
            indexer++;
        }
    }
}

注意:不要将自己局限于这个特定的布局管理器。也就是说,您应该探索其他 Layout Managers也是。

关于java - 我想通过单击添加按钮动态添加 JLabel 和文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5098017/

相关文章:

java - 对象数组的字节数组

java - IntelliJ - 从文件中获取标准输入

java - 对 DynamoDB 表的 IN 查询不起作用

java - 使用Java在opencv中的网络摄像头流

java - 如何从 ArrayList 对象填充 jtable?

java - 使用 java-bean 使用套接字共享登录数据有多安全

java - 制作随机字符字母并在java swing中一一显示

android - 布局按钮,使每个按钮平均分配空间

CSS 新手问题——标题没有采用指定的颜色

css - Bootstrap 4.2.1 Flex-box布局列溢出浏览器边缘