为什么在java中标签左侧有这么多空间?

为什么在java中标签左侧有这么多空间?,java,swing,jscrollpane,jlabel,preferredsize,Java,Swing,Jscrollpane,Jlabel,Preferredsize,以下是我所拥有的: import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List

以下是我所拥有的:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
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.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.LineBorder;

public class Main {
    // 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>();
    static JScrollPane scrollPane;

    public static void main(String[] args) {
        // Construct frame
        JFrame frame = new JFrame();
        frame.setLayout(new GridBagLayout());
        //frame.setPreferredSize(new Dimension(990, 990));
        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);
        frame.add(addButton);

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

        scrollPane = new JScrollPane(panel,   ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,  ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setPreferredSize(new Dimension(600, 600));

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

        // 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
            //JTextField jTextField = new JTextField();
            //jTextField.setSize(100, 200);
            //listOfTextFields.add(jTextField);
            listOfLabels.add(new JLabel("" + 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 = 1;
                //textFieldConstraints.fill = GridBagConstraints.HORIZONTAL;
                //textFieldConstraints.weightx = 0.5;
                //textFieldConstraints.insets = new Insets(10, 10, 10, 10);
                //textFieldConstraints.gridy = i;

                // Label constraints
                labelConstraints.gridx = 0;
                labelConstraints.gridy = i;
                labelConstraints.insets = new Insets(0, 0, 0, 0);

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

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

            System.out.println("indexer is " + indexer);

            // Increment indexer
            indexer++;
            panel.updateUI();

            if(indexer ==2){

                listOfLabels.set(0, new JLabel("Test"));

            }

        }

        private int getWidth() {
            // TODO Auto-generated method stub
            return 0;
        }
    }
}
以下是输出:

我做错了什么?我希望标签一直向左对齐。我没有在左边设置任何填充,所以我很困惑

仅供参考,我在stackoverflow上发现了这段代码,我的目标是拥有可以动态添加和更新的标签,因此我注释掉了文本框

不要在滚动窗格上调用setPreferredSize,这不是您应该设置的,请使用GridBagConstraints weightx/y和fill属性。 不要调用updateUI,它不会做您认为它会做的事情,如果必须的话,可以调用RevValidate 你遇到问题的主要原因是

面板上的呼叫设置为PreferredSize。将组件添加到GridBagLayout时,它将尝试围绕容器中心布置组件 添加标签时,您尚未为GridBagConstraints指定weightx或anchor属性