【问题标题】:Java, setting layout to nullJava,将布局设置为空
【发布时间】:2016-01-19 21:25:50
【问题描述】:

我一直在使用空布局,很多人会说不应该这样做。有没有更好的办法?

一些代码作为例子:

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);

   }
}

【问题讨论】:

  • 人们说不要使用null 布局而是使用适当的布局管理器是有原因的。像素完美布局是现代 ui 设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
  • 虽然空布局和setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始不同的所有平台或屏幕分辨率上查看时它们看起来很糟糕.
  • API 的设计者,早在 90 年代末就看到了跨平台开发 GUI 可能出现的问题,并在框架的核心设计了布局管理 API。如果您研究更现代的框架,例如 Android 和 iOS,他们已经或正在将布局管理器引入到他们的框架中,原因与桌面同行拥有它们的原因相同,生活变得更简单了。一旦你习惯了使用布局管理器,你就不想没有它们

标签: java swing layout-manager


【解决方案1】:

有没有更好的办法?

布局管理器、布局管理器、布局管理器。如果默认提供的布局管理器不能满足您的要求,请使用布局管理器的组合,或者尝试一些免费提供的布局管理器,例如 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));,我们最终会得到...

左边是你的代码,右边是我的代码……

如果您认为这过于戏剧化,那么不同的操作系统会对您造成更糟糕的影响

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2020-02-05
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多