2015-10-21 41 views
1

我一直使用空布局,而且很多人会说它不应该这样做。有没有更好的办法?Java,将布局设置为空

一些代码示例:

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

虽然null布局和'setBounds()'看起来像Swing新手似的创建复杂GUI的最简单和最好的方式,更多Swing GUI的创建使用它们时遇到的更严重的困难。它们不会在GUI大小调整时调整组件的大小,它们是增强或维护的皇室女巫,当它们放在滚动窗格中时它们会完全失败,在所有平台或屏幕分辨率与原始视图不同时,它们看起来会非常糟糕。 –

+1

早在90年代后期,API的设计者就发现了GUI的跨平台开发可能发生的问题,并在框架的核心部分设计了布局管理API。如果你看看Android和iOS等更现代化的框架,他们或者已经或者正在将布局管理器引入到他们的框架中,原因与台式机相同,因为生活更简单。一旦你习惯了使用布局管理器,你不会希望没有它们。 – MadProgrammer

回答

7

有没有更好的办法?

布局管理器,布局管理器,布局管理器。如果默认提供的布局管理器是不是做你想做的,要么使用布局管理器的组合,或者也许尝试一些免费提供的布局管理器,像MigLayout(并结合其他要求的布局管理器使用它们)

与您的代码...

Without Layout Manager

使用GridBagLayout

With Layout Manager

按钮略更大,因为它考虑了按钮的实际要求(文本和字体大小),但总是会在宽度上增加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

如果你觉得这一直是过于戏剧性,不同的操作系统会做更糟糕的事情对你那么