GridLayout外部的按钮布局

时间:2016-04-20 12:26:23

标签: java swing layout-manager grid-layout border-layout

我目前正在做一个非常简单的图形用户界面,并且想知道如何从GridLayout中获取有问题的按钮,并将其置于自己的说法BorderLayout中,如果这样的话#39}有点模糊,我会附上图片,告诉你我的意思:

enter image description here

使用该图片,我希望按钮不与网格布局一致,并且它可以像在边框布局中一样填充程序底部的所有方式。我的代码如下:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/**
 * Write a description of class HW4GUI here.
 *
 * @author (your name) 
 * @version (a version number or a date)
 */
  public class HW4GUI extends JFrame implements ActionListener
{
private JButton jbtAction;
private JTextField jtfFName;
private JTextField jtfLName;
private JTextField jtfLibNo;
private int nextLibNo;
private JPanel textPanel;

/**
 * The constructor for the GUI, also initalises nextLibNo number
 */
public HW4GUI()
{
    super("Adding a borrower");
    makeFrame();
    showFrame();
    nextLibNo = 1001;
}

/**
 *
 */
private void makeFrame()
{
    setLayout(new GridLayout(4,0));
    setResizable(false);
    textPanel = new JPanel();
    //textPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    textPanel.setLayout(new BorderLayout());

    jtfFName = new JTextField(15);
    JLabel fNLbl = new JLabel("First Name: ");
    add(fNLbl);
    add(jtfFName);
    // add(textPanel);
    fNLbl.setHorizontalAlignment(JLabel.RIGHT);
    jtfFName.setEditable(true);

    jtfLName = new JTextField(15);
    JLabel lNLbl = new JLabel("Last Name: ");
    add(lNLbl);
    add(jtfLName);
    //add(textPanel);
    lNLbl.setHorizontalAlignment(JLabel.RIGHT);
    jtfLName.setEditable(true);

    jtfLibNo = new JTextField(15);
    JLabel lNOLbl = new JLabel("Library Number: ");
    add(lNOLbl);
    add(jtfLibNo);
    // add(textPanel);
    lNOLbl.setHorizontalAlignment(JLabel.RIGHT);
    jtfLibNo.setEditable(false);


    jbtAction = new JButton("Add Borrower");
    add(jbtAction, BorderLayout.SOUTH);
    jbtAction.addActionListener(this);

}

/**
 * displays the frame window where you can set the size of it and also other variables
 */
private void showFrame()
{
    setSize(400,200);
    setResizable(false);
    setLocationRelativeTo( null);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e)
{
    String fn = jtfFName.getText();
    String ln = jtfLName.getText();
    boolean valid = true;
    if (e.getActionCommand().equals("Add Borrower"))
    {
        if (fn.equals("") && (ln.equals("")))
        {
            jtfLibNo.setText("No Names");
            valid = false;
        }
        else if (fn.equals("") )
        {
            jtfLibNo.setText("No First Name");
            valid = false;
        }
        else if (ln.equals(""))
        {
            jtfLibNo.setText("No Last Name");
            valid = false;
        }
        else

        if (valid == true)
        {
            String lib = Integer.toString(nextLibNo++);
            jtfLibNo.setText(lib);
            jbtAction.setText("Confirm");
        }
    }
    if (e.getActionCommand().equals("Confirm"))
    {
        jtfLibNo.setText("");
        jbtAction.setText("Add Borrower");
    }

}
}

2 个答案:

答案 0 :(得分:1)

正如你所说过你想要GridLayout之外的Button,你可以这样做:

  • 宣布一个新的小组,如mainPanel或类似的东西。

    JPanel mp = new JPanel();
    
  • 使用GridLayout将其布局设置为3x1。

    mp.setlayout(new GridLayout(3,1));
    
  • 将标签和文本字段添加到该面板。

    mp.add(fNLbl);// and the rest.
    
  • 将此面板添加到相框中。

    add(mp, BorderLayout.CENTER);
    
  • 然后使用BorderLayout.SOUTH

    在最后添加Button
    add(jbtAction, BorderLayout.SOUTH);
    

    但据我所知,那么你的按钮将占据整个画面的宽度。因此,您可以将按钮添加到面板,然后将该面板添加到该面板。像:

    add( new JPanel(){{ add(jbtAction);}}, BorderLayout.SOUTH); // this is double-brace initialization.
    

以下代码可以正常使用:

private void makeFrame()
{
    JPanel mp = new JPanel();
    mp.setLayout(new GridLayout(3,1));
    setResizable(false);
    textPanel = new JPanel();
    //textPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    textPanel.setLayout(new BorderLayout());

    jtfFName = new JTextField(15);
    JLabel fNLbl = new JLabel("First Name: ");
    mp.add(fNLbl);
    mp.add(jtfFName);
    // add(textPanel);
    fNLbl.setHorizontalAlignment(JLabel.RIGHT);
    jtfFName.setEditable(true);

    jtfLName = new JTextField(15);
    JLabel lNLbl = new JLabel("Last Name: ");
    mp.add(lNLbl);
    mp.add(jtfLName);
    //add(textPanel);
    lNLbl.setHorizontalAlignment(JLabel.RIGHT);
    jtfLName.setEditable(true);

    jtfLibNo = new JTextField(15);
    JLabel lNOLbl = new JLabel("Library Number: ");
    mp.add(lNOLbl);
    mp.add(jtfLibNo);
    // add(textPanel);
    lNOLbl.setHorizontalAlignment(JLabel.RIGHT);
    jtfLibNo.setEditable(false);

    jbtAction = new JButton("Add Borrower");
    add(mp, BorderLayout.CENTER);
    add( new JPanel(){{ add(jbtAction);}}, BorderLayout.SOUTH);
    jbtAction.addActionListener(this);

}

答案 1 :(得分:0)

  

使用该图片我希望按钮不与网格布局一致,并且它在程序底部一直填充,就像在边框布局中一样

然后使用BorderLayout。 JFrame的默认布局管理器是BorderLayout。所以你会做类似的事情:

  1. 使用GridLayout创建面板。将前5个组件添加到此面板。然后将面板添加到框架的“中心”。

  2. 创建按钮。添加按钮框架的“PAGE_END”。

  3. 布局管理器的想法是,您可以嵌套具有不同布局的面板以实现最终布局。

    我也同意,带有多个按钮的主面板应该是GridBagLayout,因为它会将每列的大小调整为列中最宽组件的宽度,而不是使每个列的宽度相同,这将使面板看起来更好。阅读How to Use GridBagLayout上Swing教程中的部分,了解更多信息和工作示例。