【问题标题】:Why doesn't my button position properly on my JFrame no layout?为什么我的 JFrame 没有布局上的按钮位置不正确?
【发布时间】:2016-09-05 08:15:46
【问题描述】:

所以我有一个使用 setLayout(null) 的 JFrame,所以我可以手动定位我的元素。

但是,当访问内容窗格并获取框架的大小时,它说它的高度是 1.0。

有谁知道我该如何解决这个问题?

代码如下:

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

public class Launcher extends JFrame
{
    public Launcher(String title) {
        super(title);

        setLayout(null);
        pack();

        setSize(new Dimension(LauncherUtil.LAUNCHER_WIDTH, LauncherUtil.LAUNCHER_HEIGHT));
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        displayComponents();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Launcher launch = new Launcher(LauncherUtil.LAUNCHER_TITLE);
                launch.setVisible(true);
            }
        });
    }

    private void displayComponents() {
        Dimension size = getContentPane().getSize();
        JButton launchButton = new JButton("Launch Game");
        System.out.println(size.getHeight());
        launchButton.setBounds(0, (int)size.getHeight() - 60, (int)size.getWidth(), 60);
        add(launchButton);
    }
}

【问题讨论】:

  • 要么使用适当的布局管理器并为框架调用方法pack();(添加所有组件时),要么必须自己设置框架大小(参见方法setSize(int, int))。
  • 1) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度。
  • launchButton.setBounds(0, (int)size.getHeight() - 60, (int)size.getWidth(), 60); 一个按钮拉伸到底部的宽度? PAGE_ENDBorderLayout。要增加高度,请使用setMargin(Insets)(或给它一个大字体或图标)。

标签: java swing layout-manager null-layout-manager


【解决方案1】:

如果您尝试使用 Toolkit 获取屏幕大小可能会像您想要的那样工作

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

它为您提供运行 java 程序的屏幕大小。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    内容窗格是JPanel,其默认大小为 1x1px。由于您没有将任何组件放入内容窗格,也没有为面板设置首选大小,因此内容窗格的大小保持为 1x1px。

    解决此问题的一种方法是按以下顺序调用这三个方法:

    setLayout(null);
    setPreferredSize(new Dimension(300, 400));
    pack();
    

    但是,您应该使用布局管理器而不是管理 手动确定组件的大小和位置。

    【讨论】:

    • 布局管理器不能满足我需要做的事情,我觉得定位它们绝对比弄乱插入等更容易。
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多