Java,将布局设置为null

3

我一直在使用空布局,很多人会说这样做是不合适的。有更好的方法吗?

以下是示例代码:

import javax.swing.*;

public class Main{
public static void main(String args[]){

    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    JButton button = new JButton("Click");

    //JFrame, frame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setSize(500, 500);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    //JPanel, panel
    panel.setLayout(null); //<<---- Is this correct?
    frame.add(panel);

    //JButton, button
    button.setBounds(25, 25, 100, 60); //<<---- Is this correct?
    panel.add(button);

   }
}

4
人们说不要使用“null”布局,而应该使用适当的布局管理器,这是有原因的。在现代 UI 设计中,“像素完美”的布局是一种幻觉。有太多因素会影响组件的大小,其中没有一个是您可以控制的。Swing 的设计核心就是与布局管理器一起工作,如果放弃使用布局管理器,将导致无数问题和难题,您会花费越来越多的时间来尝试纠正。 - MadProgrammer
3
虽然采用空布局和setBounds()可能会让Swing新手觉得这是创建复杂GUI的最简单、最好的方法,但随着您创建的Swing GUI越多,使用它们时就会遇到越严重的困难。当GUI调整大小时,它们不会调整您的组件大小;在增强或维护时,它们很难搞定;将它们放入滚动窗格中会完全失败;在与原始平台或屏幕分辨率不同的所有平台上查看时,它们看起来非常糟糕。 - Hovercraft Full Of Eels
1
API的设计者们早在90年代末就预见到了跨平台GUI开发可能会出现的问题,并设计了框架核心的布局管理API。如果你深入研究更现代的框架,比如Android和iOS,它们要么已经引入了布局管理器,要么正在为同样的原因引入。生活就是这么简单。一旦你习惯了使用布局管理器,你就不想再没有它们了。 - MadProgrammer
1个回答

9

有更好的方法吗?

布局管理器,布局管理器,布局管理器。如果提供的默认布局管理器不能满足您的需求,可以使用多个布局管理器的组合或者尝试一些免费的布局管理器,例如MigLayout(并根据需要与其他布局管理器一起使用)

使用您的代码...

没有布局管理器

使用 GridBagLayout

使用布局管理器

按钮略大一些,因为它考虑了按钮的实际要求(文本和字体大小),但宽度始终会增加100像素,高度增加60像素。

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

    public static void main(String args[]) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JButton button = new JButton("Click");

        //JFrame, frame
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        //JPanel, panel
        panel.setLayout(new GridBagLayout());
        frame.add(panel);

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.ipadx = 100;
        gbc.ipady = 60;
        gbc.insets = new Insets(25, 25, 0, 0);
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.anchor = GridBagConstraints.NORTHWEST;

        panel.add(button, gbc);

    }
}

现在,如果我只添加button.setFont(button.getFont().deriveFont(64f));,我们就会得到...
左边是您的代码,右边是我的代码... Wow to null layouts 如果你认为这有些过分了,不同的操作系统会对你做出更糟糕的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接