2015-10-21 71 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

如果你覺得這一直是過於戲劇性,不同的操作系統會做更糟糕的事情對你那麼