Java 如何将JButton拉伸到JPanel的全高

Java 如何将JButton拉伸到JPanel的全高,java,swing,jpanel,jbutton,Java,Swing,Jpanel,Jbutton,为了总结我的问题,我正在用Java开发一个应用程序接口。我遇到了一个以前从未遇到过的问题。 为了创建一种“导航栏”,我在JFrame的顶部创建了一个瘦JPanel。然后,我想在其中添加一个JButton来表示“home”按钮,该按钮指向应用程序的开始内容。当我这样做并使按钮的宽度和高度等于面板的高度时,按钮与面板顶部之间有一个大约3像素的小间隙。我不知道为什么,面板内没有其他元素。我没有使用任何布局,但是我已经尝试使用FlowLayout来解决这个问题,但是没有任何真正的改变 这是界面的完整代码

为了总结我的问题,我正在用Java开发一个应用程序接口。我遇到了一个以前从未遇到过的问题。 为了创建一种“导航栏”,我在JFrame的顶部创建了一个瘦JPanel。然后,我想在其中添加一个JButton来表示“home”按钮,该按钮指向应用程序的开始内容。当我这样做并使按钮的宽度和高度等于面板的高度时,按钮与面板顶部之间有一个大约3像素的小间隙。我不知道为什么,面板内没有其他元素。我没有使用任何布局,但是我已经尝试使用FlowLayout来解决这个问题,但是没有任何真正的改变

这是界面的完整代码,我用红色标记菜单面板只是为了测试。我该如何消除与顶部的小间隙

package UserInterface;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Interface {

private JFrame frame;
private JPanel menu;
private JPanel content;

public JButton home;

public Interface() {

    Dimension dim = new Dimension(50, 50);

    frame = new JFrame();
    menu = new JPanel();
    content = new JPanel();

    frame.setSize(1600, 900);
    menu.setSize(1600, 50);
    content.setSize(1600, 850);

    frame.setTitle("Tierland");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(
            (int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2) - (frame.getWidth() / 2)),
            (int)((Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2) - (frame.getHeight() / 2))
    );

    frame.setSize(1600, 900);
    menu.setSize(1600, 50);
    content.setSize(1600, 850);

    menu.setBackground(Color.RED);

    home = new JButton();
    home.setPreferredSize(dim);
    home.setMinimumSize(dim);
    home.setMaximumSize(dim);
    home.setSize(dim);


    frame.add(menu);
    frame.add(content);

    frame.setVisible(true);
    menu.setVisible(true);
    content.setVisible(true);

}
}

我没有使用任何布局

是的,你是。默认情况下,JPanel使用FlowLayout

然而,我已经尝试使用FlowLayout来解决这个问题,但是没有任何改变

这是因为默认FlowLayout在添加到面板的任何组件周围使用5像素间隙

您应该使用:

menu.setLayout( new FlowLayout(...) );
frame.add(menu, BorderLayout.PAGE_START);
frame.add(content, BorderLayout.CENTER);
阅读FlowLayout API以获得适当的构造函数,该构造函数允许您将0用于水平和/或垂直间隙

frame.add(menu);
frame.add(content);
此外,默认情况下,框架的内容窗格使用边框布局,因此您应该使用:

menu.setLayout( new FlowLayout(...) );
frame.add(menu, BorderLayout.PAGE_START);
frame.add(content, BorderLayout.CENTER);
您不应试图控制按钮的大小:

//home.setPreferredSize(dim);
//home.setMinimumSize(dim);
//home.setMaximumSize(dim);
只需设置按钮的文本或在按钮上添加图标,按钮将确定其自己的首选大小

此外,你真的应该称你的“菜单”面板为“工具栏”面板。Swing已经支持菜单,并且有一种特殊的方法可以将菜单栏添加到框架中。有关更多信息,请阅读上的Swing教程部分

我没有使用任何布局

是的,你是。默认情况下,JPanel使用FlowLayout

然而,我已经尝试使用FlowLayout来解决这个问题,但是没有任何改变

这是因为默认FlowLayout在添加到面板的任何组件周围使用5像素间隙

您应该使用:

menu.setLayout( new FlowLayout(...) );
frame.add(menu, BorderLayout.PAGE_START);
frame.add(content, BorderLayout.CENTER);
阅读FlowLayout API以获得适当的构造函数,该构造函数允许您将0用于水平和/或垂直间隙

frame.add(menu);
frame.add(content);
此外,默认情况下,框架的内容窗格使用边框布局,因此您应该使用:

menu.setLayout( new FlowLayout(...) );
frame.add(menu, BorderLayout.PAGE_START);
frame.add(content, BorderLayout.CENTER);
您不应试图控制按钮的大小:

//home.setPreferredSize(dim);
//home.setMinimumSize(dim);
//home.setMaximumSize(dim);
只需设置按钮的文本或在按钮上添加图标,按钮将确定其自己的首选大小


此外,你真的应该称你的“菜单”面板为“工具栏”面板。Swing已经支持菜单,并且有一种特殊的方法可以将菜单栏添加到框架中。有关更多信息,请阅读Swing教程中的部分。

感谢您的回答,它帮助了很多。我不知道你能控制布局的间隙。我也不知道JFrame默认使用BoxLayout。最后,主页按钮的大小强制不是永久性的,我只是还没有添加图标。但是我知道它的大小正好是50x50px,所以为了测试,我把它强制为50x50px。麦克刚才回答说,框架使用了
BorderLayout
而不是
BoxLayout
不要把两者混淆!!仍然强制设置高度是个坏主意,按钮高度是由图标和文本之间最高的高度加上边框插入来计算的!!这只是默认的实现!!某些外观可能会对组件使用额外的插图,所以不要这样做,否则您可能会看到小故障@谢谢你的回答,它帮了我很大的忙。我不知道你能控制布局的间隙。我也不知道JFrame默认使用BoxLayout。最后,主页按钮的大小强制不是永久性的,我只是还没有添加图标。但是我知道它的大小正好是50x50px,所以为了测试,我把它强制为50x50px。麦克刚才回答说,框架使用了
BorderLayout
而不是
BoxLayout
不要把两者混淆!!仍然强制设置高度是个坏主意,按钮高度是由图标和文本之间最高的高度加上边框插入来计算的!!这只是默认的实现!!某些外观可能会对组件使用额外的插图,所以不要这样做,否则您可能会看到小故障@塞鲍克内赫特