Java jb按钮显示在主面板(?)的外部

Java jb按钮显示在主面板(?)的外部,java,eclipse,user-interface,Java,Eclipse,User Interface,我是新手 我正在尝试创建一个框架,它有一个黑色面板来创建一些动画,还有一个ui面板来放置控制按钮。但当我创建JButton并将其添加到ui面板时,它们似乎在ui面板之外 我认为这是因为布局,但我无法决定哪种布局最适合我的情况。尝试了GridLayout,GridBoxLayout,BoxLayout…它们似乎都不好,我很确定我错过了一些东西 Oracle文档非常丰富,但我不能说它对我帮助很大,因为我很难理解布局 这是我的密码: 多亏了伯杰的回答,我编辑了我的代码,但仍然有问题,所以我更新了代码和

我是新手

我正在尝试创建一个框架,它有一个黑色面板来创建一些动画,还有一个ui面板来放置控制按钮。但当我创建JButton并将其添加到ui面板时,它们似乎在ui面板之外

我认为这是因为布局,但我无法决定哪种布局最适合我的情况。尝试了GridLayout,GridBoxLayout,BoxLayout…它们似乎都不好,我很确定我错过了一些东西

Oracle文档非常丰富,但我不能说它对我帮助很大,因为我很难理解布局

这是我的密码: 多亏了伯杰的回答,我编辑了我的代码,但仍然有问题,所以我更新了代码和屏幕截图,使其清晰明了。

没关系,我忘了修理一些零件,伯杰的回答是性能良好。谢谢

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

public class gui {
public static void InitializeGUI(){
//DEFINE MAIN FRAME
JFrame window = new JFrame("Simulator");
window.setSize(1000, 1000);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
//DEFINE UNIVERSE PANEL
JPanel universe = new JPanel(){
        /**
     * 
     */
private static final long serialVersionUID = 1L;

@Override
    public Dimension getPreferredSize() {
    return new Dimension(window.getContentPane().getSize().width, 3 *     window.getSize().height / 4);
}
};
universe.setBackground(Color.BLACK);
//DEFINE UI PANEL
JPanel ui = new JPanel() {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(window.getContentPane().getSize().width, window.getSize().height / 4);
    }
};
//DEFINE BUTTONS
JButton femalespawnbutton = new JButton("Spawn Female");
femalespawnbutton.setSize(150, 100);
JButton malespawnbutton = new JButton("Spawn Male");
malespawnbutton.setSize(150, 100);

//FILL
ui.add(femalespawnbutton, BorderLayout.CENTER);
ui.add(malespawnbutton, BorderLayout.CENTER);
window.add(universe, BorderLayout.NORTH);
window.add(ui, BorderLayout.SOUTH);
window.setVisible(true);
 }
}

很抱歉-目前我没有太多时间-但现在:这是布局经理的问题。您应该在初始化JPanel时设置一个。e、 g.新Jpanel(新网格布局(1,2));->可以,但不好;)有关布局的更多信息:


第一件事是将两个面板添加到
窗口,该窗口的内容窗格具有
边框布局

所以

window.add(universe, BorderLayout.CENTER);
window.add(ui, BorderLayout.CENTER);
两个组件被添加到同一个位置(按钮可能是隐藏的)

为了避免这种情况,您可以给出约束,指示您要在
边框布局中添加组件的位置。例如:

window.add(universe, BorderLayout.CENTER);
window.add(ui, BorderLayout.SOUTH);
第二件事是您正在使用
setSize()
,除非您没有布局管理器,否则将不考虑这一点

您可以使用
setPreferredSize
代替,它的
height
值将由一些布局管理器执行,例如
BorderLayout
用于
SOUTH
NORTH
组件:

ui.setPreferredSize(new Dimension(1000, 250));
现在,如果要使其适应窗口的大小,请替代该方法:

JPanel ui = new JPanel() {

            @Override
            public Dimension getPreferredSize() {

                return new Dimension(window.getContentPane().getSize().width, window.getContentPane().getSize().height / 4);

            }
        };
将其放在一起(考虑到南部构件的首选高度,在您的情况下,无需为中心构件提供一个高度,它将占用剩余空间):

最后一个重要提示:

尽管这种方法在某些情况下有效,但不鼓励您自己设置组件的大小(windows之类的顶级容器除外):


请参阅:

问题是,无论我使用什么样的ui面板(GridLayour或GridBag),按钮总是假装ui面板的大小是(10001000),而不是(1000250),因此它们超出了ui面板的范围。谢谢你的回复,anwyay,正如我所说的,很难理解,但我正在编写oracle教程。谢谢你的回复,这真的很有帮助,我想我明白了为什么我应该避免给对象提供精确的度量。尽管我通过重写PreferedSize方法成功地将我的universe和ui面板放置在正确的度量中,但我仍然存在问题。我的按钮仍在ui面板之外,其中一个按钮在我将鼠标移到上面之前是不可见的。通过你们的回答,我明白了按钮实际上并不是在面板外,它只是我的宇宙面板在ui面板的顶部,覆盖了它的一部分。但是,如何?我想我修正了面板的大小?这是截图:还有我的代码的更新版本:事实上,似乎窗口的高度考虑了标题栏,你可以使用
window.getContentPane().getSize()
,我会编辑答案。我还编辑了我的问题(代码和截图)因为我仍然有麻烦,你可以看到。哦,我的错。对此我很抱歉。现在工作得很好。谢谢你耐心地帮助这个新手:3
JPanel ui = new JPanel() {

            @Override
            public Dimension getPreferredSize() {

                return new Dimension(window.getContentPane().getSize().width, window.getContentPane().getSize().height / 4);

            }
        };
   //DEFINE MAIN FRAME
    final JFrame window = new JFrame("Simulator");
    window.setSize(1000, 1000);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLocationRelativeTo(null);

    //DEFINE UNIVERSE PANEL
    JPanel universe = new JPanel();
    universe.setBackground(Color.BLACK);

    //DEFINE UI PANEL
    JPanel ui = new JPanel() {

        @Override
        public Dimension getPreferredSize() {

            return new Dimension(window.getContentPane().getSize().width, window.getContentPane().getSize().height / 4);

        }
    };

    //DEFINE BUTTONS
    JButton femalespawnbutton = new JButton("Spawn Female");
    femalespawnbutton.setSize(250, 100);
    JButton malespawnbutton = new JButton("Spawn Male");
    malespawnbutton.setSize(250, 100);

    //FILL
    ui.add(femalespawnbutton);
    ui.add(malespawnbutton);
    window.add(universe, BorderLayout.CENTER);
    window.add(ui, BorderLayout.SOUTH);
    window.setVisible(true);