在主面板/框架中定位面板和组件

时间:2012-11-21 23:04:23

标签: java swing user-interface jpanel layout-manager

我必须创建一个表单,其中包含用户名,密码和其他内容的输入值。这是一个指向图像的链接http://img196.imageshack.us/img196/1727/empdesign.png

我希望所有这些属性都分配到屏幕边缘,而不是居中。我尝试使用方法JComponenet.setHorizo​​ntalAlignment(SwingConstants.LEFT),但这也没有做任何事情。我在JLabels和JPanels上尝试过这种方法,但都没有效果。

这是我的代码:

public class tada extends GUIDesign{

  //making all the jlabels to be placed

JLabel usernameLabel = new JLabel("username");
JLabel passwordLabel = new JLabel("Name");
JLabel empIDLabel = new JLabel("empID");
JLabel SalaryLabel = new JLabel("Salary");
JLabel EmployerLabel = new JLabel(" Salary");
JLabel hoursLabel = new JLabel("Gender");

JLabel departmentLabel = new JLabel("Department");



 //making all the textfields, combo boxes, and etc. 
JTextField usernameField = new JTextField(20);
JTextField passwordField = new JTextField(20);
JTextField empIDField = new JTextField(20);


JTextField SalaryField = new JTextField(20);
JTextField EmployerField = new JTextField(20);
String[] hourss = {"Fall", "Spring", "Summer"};
JComboBox hoursBox = new JComboBox(hourss);

JCheckBox[] departmentCheckBoxesBoxs = {new JCheckBox("Department 1"), 
                                        new JCheckBox("Department 2"), 
                                        new JCheckBox("Department 3"), 
                                        new JCheckBox("Department 4"), 
                                        new JCheckBox("Department 5")};






String[] Salary = {"section", "combo", "box"};
JComboBox sectionBox = new JComboBox(Salary);


//making all the panels to be placed inside the main panel. 

JPanel usernamePanel = new JPanel();
JPanel passwordPanel = new JPanel();
JPanel empIDPanel = new JPanel();
JPanel SalaryPanel = new JPanel();
JPanel EmployerPanel = new JPanel();
JPanel hoursPanel = new JPanel();
JPanel departmentsPanel = new JPanel();

JPanel top, bottom;


JButton submitButton = new JButton("Submit");

public tada(){

//这会从超类初始化面板。没有什么真正重要的继承自超类。     超级(“雇主设计”,10);

    setPreferredSize(new Dimension(400,600));

//将所有标签,文本字段等添加到子面板,并将子面板添加到主面板底部。     setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS));         top = new JPanel();         top.setSize(getWidth(),30);         bottom = new JPanel();         bottom.setLayout(new BoxLayout(bottom,BoxLayout.Y_AXIS));

    top.setBackground(Color.red);
    title.setFont(new Font("Helvetica", 1,20));
    top.add(title);
    bottom.setBackground(Color.yellow);

    usernamePanel.add(usernameLabel);
    usernamePanel.add(usernameField);
    bottom.add(usernamePanel);

    passwordPanel.add(passwordLabel);
    passwordPanel.add(passwordField);
    bottom.add(passwordPanel);

    empIDPanel.add(empIDLabel);
    empIDPanel.add(empIDField);
    bottom.add(empIDPanel);

    SalaryPanel.add(SalaryLabel);
    SalaryPanel.add(SalaryField);
    bottom.add(SalaryPanel);

    EmployerPanel.add(EmployerLabel);
    EmployerPanel.add(EmployerField);
    bottom.add(EmployerPanel);

    hoursPanel.add(hoursLabel);
    hoursPanel.add(hoursBox);
    bottom.add(hoursPanel);

    departmentsPanel.add(departmentLabel);
    for(JCheckBox jbc: departmentCheckBoxesBoxs)
    {
        departmentsPanel.add(jbc);
    }
    bottom.add(departmentsPanel);




    add(top);
    add(bottom);


}

//也,因为我正在使用boxLayout(),并且它被分配给y_axis,我认为它会自动进行y轴对齐,但事实并非如此。

2 个答案:

答案 0 :(得分:2)

根据您的代码,我能看到的最简单的方法是简单地更改主容器布局管理器。在这里我使用了网格袋布局,因为它允许我根据需要更改每个组件的个性化需求

enter image description here

public class BadLayout05 {

    public static void main(String[] args) {
        new BadLayout05();
    }

    public BadLayout05() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new tada());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class tada extends JPanel {

        //making all the jlabels to be placed
        JLabel usernameLabel = new JLabel("username");
        JLabel passwordLabel = new JLabel("Name");
        JLabel empIDLabel = new JLabel("empID");
        JLabel SalaryLabel = new JLabel("Salary");
        JLabel EmployerLabel = new JLabel(" Salary");
        JLabel hoursLabel = new JLabel("Gender");
        JLabel departmentLabel = new JLabel("Department");
        //making all the textfields, combo boxes, and etc.
        JTextField usernameField = new JTextField(20);
        JTextField passwordField = new JTextField(20);
        JTextField empIDField = new JTextField(20);
        JTextField SalaryField = new JTextField(20);
        JTextField EmployerField = new JTextField(20);
        String[] hourss = {"Fall", "Spring", "Summer"};
        JComboBox hoursBox = new JComboBox(hourss);
        JCheckBox[] departmentCheckBoxesBoxs = {new JCheckBox("Department 1"),
            new JCheckBox("Department 2"),
            new JCheckBox("Department 3"),
            new JCheckBox("Department 4"),
            new JCheckBox("Department 5")};
        String[] Salary = {"section", "combo", "box"};
        JComboBox sectionBox = new JComboBox(Salary);
//making all the panels to be placed inside the main panel.
        JPanel usernamePanel = new JPanel();
        JPanel passwordPanel = new JPanel();
        JPanel empIDPanel = new JPanel();
        JPanel SalaryPanel = new JPanel();
        JPanel EmployerPanel = new JPanel();
        JPanel hoursPanel = new JPanel();
        JPanel departmentsPanel = new JPanel();
        JPanel top = new JPanel();
        JPanel bottom = new JPanel();
        JButton submitButton = new JButton("Submit");

        public tada() {

//this initializes the panel from superclass. nothing really important inherited from superclass. super("employer design", 10);

        // This is bad idea...
//            setPreferredSize(new Dimension(400, 600));

//adding all the labels, text fields, etc to the sub-panels, and adding subpanels to main pannel, bottom. setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS)); top = new JPanel(); top.setSize(getWidth(), 30); bottom = new JPanel(); bottom.setLayout(new BoxLayout(bottom,BoxLayout.Y_AXIS));

            top.setBackground(Color.red);
            JLabel title = new JLabel("Employer Design");
            // This is a bad idea - IHMO
            title.setFont(new Font("Helvetica", 1, 20));
            top.add(title);
            bottom.setBackground(Color.yellow);

            usernamePanel.add(usernameLabel);
            usernamePanel.add(usernameField);
            bottom.add(usernamePanel);

            passwordPanel.add(passwordLabel);
            passwordPanel.add(passwordField);
            bottom.add(passwordPanel);

            empIDPanel.add(empIDLabel);
            empIDPanel.add(empIDField);
            bottom.add(empIDPanel);

            SalaryPanel.add(SalaryLabel);
            SalaryPanel.add(SalaryField);
            bottom.add(SalaryPanel);

            EmployerPanel.add(EmployerLabel);
            EmployerPanel.add(EmployerField);
            bottom.add(EmployerPanel);

            hoursPanel.add(hoursLabel);
            hoursPanel.add(hoursBox);
            bottom.add(hoursPanel);

            departmentsPanel.add(departmentLabel);
            for (JCheckBox jbc : departmentCheckBoxesBoxs) {
                departmentsPanel.add(jbc);
            }

            GridBagConstraints gbc = new GridBagConstraints();
            setLayout(new GridBagLayout());
            gbc.gridx = 0;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            add(top, gbc);
            gbc.weightx = 0;
            gbc.fill = GridBagConstraints.NONE;
            gbc.anchor = GridBagConstraints.WEST;
            add(usernamePanel, gbc);
            add(passwordPanel, gbc);
            add(empIDPanel, gbc);
            add(SalaryPanel, gbc);
            add(EmployerPanel, gbc);
            add(hoursPanel, gbc);
            add(departmentsPanel, gbc);
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(bottom, gbc);

        }
    }
}

更好的解决方案可能是将主要字段添加到单个面板并使用GridBagLayout代替

enter image description here

public class BadLayout05 {

    public static void main(String[] args) {
        new BadLayout05();
    }

    public BadLayout05() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new tada());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class tada extends JPanel {

        //making all the jlabels to be placed
        JLabel usernameLabel = new JLabel("username");
        JLabel passwordLabel = new JLabel("Name");
        JLabel empIDLabel = new JLabel("empID");
        JLabel SalaryLabel = new JLabel("Salary");
        JLabel EmployerLabel = new JLabel(" Salary");
        JLabel hoursLabel = new JLabel("Gender");
        JLabel departmentLabel = new JLabel("Department");
        //making all the textfields, combo boxes, and etc.
        JTextField usernameField = new JTextField(20);
        JTextField passwordField = new JTextField(20);
        JTextField empIDField = new JTextField(20);
        JTextField SalaryField = new JTextField(20);
        JTextField EmployerField = new JTextField(20);
        String[] hourss = {"Fall", "Spring", "Summer"};
        JComboBox hoursBox = new JComboBox(hourss);
        JCheckBox[] departmentCheckBoxesBoxs = {new JCheckBox("Department 1"),
            new JCheckBox("Department 2"),
            new JCheckBox("Department 3"),
            new JCheckBox("Department 4"),
            new JCheckBox("Department 5")};
        String[] Salary = {"section", "combo", "box"};
        JComboBox sectionBox = new JComboBox(Salary);
        JPanel fields = new JPanel();
        JPanel departmentsPanel = new JPanel();
        JPanel top = new JPanel();
        JPanel bottom = new JPanel();
        JButton submitButton = new JButton("Submit");

        public tada() {

            top.setBackground(Color.red);
            JLabel title = new JLabel("Employer Design");
            title.setFont(new Font("Helvetica", 1, 20));
            top.add(title);
            bottom.setBackground(Color.yellow);

            fields.setLayout(new GridBagLayout());
            GridBagConstraints gbcLabels = new GridBagConstraints();
            GridBagConstraints gbcFields = new GridBagConstraints();

            gbcLabels.gridx = 0;
            gbcLabels.gridy = 0;
            gbcLabels.anchor = GridBagConstraints.WEST;
            gbcLabels.insets = new Insets(2, 2, 2, 2);

            gbcFields.gridx = 1;
            gbcFields.gridy = 0;
            gbcFields.anchor = GridBagConstraints.WEST;
            gbcFields.weightx = 1;
            gbcFields.insets = new Insets(2, 2, 2, 2);

            fields.add(usernameLabel, gbcLabels);
            fields.add(usernameField, gbcFields);

            gbcFields.gridy = ++gbcLabels.gridy;

            fields.add(passwordLabel, gbcLabels);
            fields.add(passwordField, gbcFields);

            gbcFields.gridy = ++gbcLabels.gridy;

            fields.add(empIDLabel, gbcLabels);
            fields.add(empIDField, gbcFields);

            gbcFields.gridy = ++gbcLabels.gridy;

            fields.add(SalaryLabel, gbcLabels);
            fields.add(SalaryField, gbcFields);

            gbcFields.gridy = ++gbcLabels.gridy;

            fields.add(EmployerLabel, gbcLabels);
            fields.add(EmployerField, gbcFields);

            gbcFields.gridy = ++gbcLabels.gridy;

            fields.add(hoursLabel, gbcLabels);
            fields.add(hoursBox, gbcFields);

            departmentsPanel.add(departmentLabel);
            for (JCheckBox jbc : departmentCheckBoxesBoxs) {
                departmentsPanel.add(jbc);
            }

            GridBagConstraints gbc = new GridBagConstraints();
            setLayout(new GridBagLayout());
            gbc.gridx = 0;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            add(top, gbc);
            gbc.weightx = 0;
            gbc.fill = GridBagConstraints.NONE;
            gbc.anchor = GridBagConstraints.WEST;
            add(fields, gbc);
//            add(passwordPanel, gbc);
//            add(empIDPanel, gbc);
//            add(SalaryPanel, gbc);
//            add(EmployerPanel, gbc);
//            add(hoursPanel, gbc);
            add(departmentsPanel, gbc);
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(bottom, gbc);

        }
    }
}

答案 1 :(得分:0)

BoxLayout 将面板与Y轴对齐。这是因为它们都是垂直堆叠的。

现在,要按照您想要的方式将组件排列在右侧,您需要为每个子面板添加布局管理器(例如usernamePanel,passwordPanel等)。一种方法是在X轴上对齐每个BoxLayoutsetAlignment()。然后务必为每个JLabelJTextField致电{{1}},以便他们排在左侧。