如何在 JFrame 中正确实现 JButton?它只是占据了整个屏幕

How to properly implement JButton in JFrame? It just takes up the whole screen

我是 GUI 制作的新手,我不太了解如何正确实现 JButton。所以我把它放进去了,但我似乎无法让它不占用整个 window。我只想要 window 底部的一个小按钮。

我试过 setbounds 和 setsize,但似乎都不起作用。

import java.awt.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;

public class Menu extends JFrame implements ActionListener{

    private Container win;
    private Color color;
    private ImageIcon exportButton = new ImageIcon("export.png");

    public Menu(){
        super("MLA Formatter");
        JButton b1;
        win = getContentPane();
        win.setBackground(Color.white);
        b1 = new JButton("Export File");
        b1.setVerticalTextPosition(AbstractButton.CENTER);
        b1.setHorizontalTextPosition(AbstractButton.CENTER);
//        b1.setBounds(500,900,100,100);
        b1.setSize(100,100);
        add(b1);

    }

    public static void main(String[] args){
        Menu window = new Menu();
        window.setBounds(200, 200, 1000, 1000);
        window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        window.setVisible(true);
    }


    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

您要么需要

  1. 正确使用布局管理器。(默认情况下,对于 JFrame,它的 BorderLayout)
  2. 或将布局设置为空。

在您的构造函数中只需添加:

setLayout(null);

您的构造函数应如下所示:

    public Menu(){
        super("MLA Formatter");
        JButton b1;
        setLayout(null); // add this line
        win = getContentPane();
        win.setBackground(Color.white);
        b1 = new JButton("Export File");
        b1.setBounds(500,400,100,100);  //changed this co-ordinates(900 will overflow)
        b1.setSize(100,100);
        add(b1);

    }

尽管如此,我还是建议您学习使用布局管理器。

我将尝试用下面的示例演示您的选项(这里我使用了您的代码并将其最小化以证明我的观点。)。

这里我提到了4个选项。您可以取消注释每个选项下的代码(一次一个)并 运行 它并查看您自己。

import javax.swing.*;
import java.awt.*;

public class Menu extends JFrame {

  public Menu() {
    super("MLA Formatter");
    JButton b1 = new JButton("Export File");
    b1.setVerticalTextPosition(AbstractButton.CENTER);
    b1.setHorizontalTextPosition(AbstractButton.CENTER);

//Layout 1
//Default layout of JFrame content pane is BorderLayout.
//When we do not specify a constraint (like BorderLayout.SOUTH), default is BorderLayout.CENTER
//So, this is equivalent to add(b1, BorderLayout.CENTER);
    //add(b1);

//Layout 2
    //add(b1, BorderLayout.SOUTH);

//Layout 3
    //setLayout(new FlowLayout());
    //add(b1);

//Layout 4
    setLayout(new GridBagLayout());
    add(b1, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.SOUTH,
        GridBagConstraints.NONE, new Insets(10, 10, 10, 10), 0, 0));
  }

  public static void main(String[] args) {
    Menu window = new Menu();
    window.setBounds(200, 200, 1000, 800);
    window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    window.setVisible(true);
  }
}