java - GridLayout 之外的按钮布局

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

我目前正在做一个非常简单的 GUI,并且想知道如何从 GridLayout 中取出有问题的按钮并将其放入自己的 BorderLayout 中,如果这有点模糊,我会附上图片来向您展示我的意思:

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");
    }

}
}

最佳答案

正如您所说,您希望 Button 位于 GridLayout 之外,您可以这样做:

  • 声明一个新面板,例如 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 在末尾添加按钮。

    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);

}

关于java - GridLayout 之外的按钮布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36743775/

相关文章:

java - 如何保存,另存为Java?

java - DesignGridLayout 超出边界

java - JFrame 的 BoxLayout

java - 执行和测试 stanford core nlp 示例

java - Apache poi excel 链接到其他页面/工作表

java - 可编辑的组合框有问题

java - JLabel 上的鱼眼效果

java - 我应该如何将 JscrollPane 添加到包含布局为 null 的 jg 面板的框架中

java - 时间复杂度 - 将映射条目复制到 Arraylist

java - 从预先存在的应用程序创建 Web 应用程序