在JFrame中设置布局的问题

时间:2014-07-08 06:34:07

标签: java swing jframe layout-manager

我正在尝试在面板中设置文本框和标签,但文本框的大小不合适,布局也没有正确设置

public class FrameLayout1 implements ActionListener {
 JTextField[] txtName;
    JLabel[] lblname; 
    JCheckBox keyButton;
    JCheckBox cascadeButton;
    JComboBox SetList;
    JComboBox ClassList;
    JLabel[] lblType;
    JTextField txtJoinColumn;
    JLabel[] lblAssoType;
    JTextField[] txtJoinColumnAssoc;

    FrameLayout1(){

    }
  public void setDetailsPanel() 
    {

        txtName = new JTextField[10];
        txtJoinColumnAssoc = new JTextField[10];
        lblname=new JLabel[10]; 
        lblType=new JLabel[10];
        lblAssoType=new JLabel[20]; 
        JFrame ColumnFrame=new JFrame("Enter the Column Values"); 

        int i=0;

        JPanel panel =  new JPanel(new GridLayout(0,1,5,10));

        for (i=0;i<5;i++) 
        {
            JPanel panelTxtLbl =  new JPanel(new GridLayout(0,2));
            lblname[i] = new JLabel("label"+i+":", JLabel.LEFT);
            panelTxtLbl.add(lblname[i]);

            txtName[i] = new JTextField(15);
            panelTxtLbl.add(txtName[i]);

            panel.add(panelTxtLbl);
            lblType[i] = new JLabel("labeldata", JLabel.LEFT);
            panel.add(lblType[i]);


            String[] SetStrings = { "One to Many","Many to Many" };
            SetList = new JComboBox(SetStrings);
            SetList.setSelectedIndex(1);
            panel.add(SetList);

            cascadeButton = new JCheckBox("cascade"); 
            cascadeButton.setSelected(true);
            panel.add(cascadeButton);

            JPanel panelSetClass =  new JPanel(new GridLayout(0,2));
            for(int j=0;j<3;j++)
             {
                lblAssoType[j]=new JLabel("Label Inner"+j+":", JLabel.LEFT);
                panelSetClass.add(lblAssoType[j]);

                txtJoinColumnAssoc[j] = new JTextField(15);
                panelSetClass.add(txtJoinColumnAssoc[j]);

             }
                panel.add(panelSetClass);
                panel.add(createHorizontalSeparator());
        } 


            //detailsPanel.add(panel, BorderLayout.CENTER);
            //detailsPanel.setAutoscrolls(true);
            panel.setAutoscrolls(true);
            JButton button = new JButton("Submit");
            button.addActionListener(this);
            //detailsPanel.add(button,BorderLayout.PAGE_END); 
            panel.add(button,BorderLayout.PAGE_END); 

            Color c=new Color(205, 222, 216);
            ColumnFrame.setLayout(new BorderLayout());
            ColumnFrame.add(panel,BorderLayout.CENTER);
            //ColumnFrame.setSize(700,600);
            ColumnFrame.setBackground(c);
            ColumnFrame.pack();
            ColumnFrame.setVisible(true);
            ColumnFrame.setLocation(200, 200);
    }
    /*
     * to add a horizontal line in the panel
     */
    static JComponent createHorizontalSeparator() {  
         JSeparator x = new JSeparator(SwingConstants.HORIZONTAL);  
         x.setPreferredSize(new Dimension(3,2));  
         return x;   
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    } 


}

createHorizo​​ntalSeparator函数可以帮助您在面板中添加水平线,因为我无法隔离字段。

当前输出

Imgur

所需的输出

Imgur

1 个答案:

答案 0 :(得分:1)

今天,我回答了一个类似的question,其中GridLayout造成的情况大致相同 混乱。自己做一个服务并使用灵活的布局管理器 (如果可能的话)像MigLayout一样创建布局。这些 简单的内置布局管理器应用程序非常有限 (GridLayoutFlowLayoutBorderLayout)或者它可能变得具有挑战性 用它们创建柔和的布局(BoxLayout)。

GridLayoutBorderLayout拉伸他们的组件而不是 尊重他们孩子的大小范围。这就是你的原因 有那些不必要的空格以及按钮水平扩展的原因。

以下是模仿布局的示例。它创建于 强大的MigLayout经理。

package com.zetcode;

import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;


public class DetailsPanel extends JFrame {

    public DetailsPanel() {

        initUI();

        setTitle("Details");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        setLayout(new MigLayout("ins 10, wrap 2", "[][grow]"));

        add(new JLabel("Label 1:"));
        add(new JTextField(), "w 200, growx");

        add(new JLabel("Label 2:"));
        add(new JTextField(), "growx");    

        add(new JLabel("Label 3:"));
        add(new JTextField(), "gaptop 30, growx");

        add(new JLabel("Label 4:"));
        add(new JTextField(), "growx");      

        add(new JLabel("Label 5:"));
        add(new JTextField(), "gaptop 30, growx");

        add(new JLabel("Label 6:"));
        add(new JTextField(), "growx");          

        add(new JButton("Submit"), "gaptop 30, skip, right");


        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                DetailsPanel ex = new DetailsPanel();
                ex.setVisible(true);
            }
        });
    }
}

您需要花一些时间来学习更复杂的布局管理器,但是 它得到了回报。特别是,如果你经常在Swing中构建布局。

Details