2013-05-16 140 views
2

是否有一個佈局管理器可以提供與Absolute Positioning相同程度的控制權? 但也可以自動調整大小?什麼地方可以使用相對座標來放置元素?替代絕對佈局?

+1

'GridBagLayout' – Tdorno

+0

從來只使用一個整個應用程序佈局管理,沒有替代嵌套佈局,不是真正的佈局管理,但對邏輯一個contaier分裂與幾個貨櫃不同,但使用相同的LayoutManager – mKorbel

回答

3

GridBagLayout是Swing中最靈活的標準佈局管理器,它可以實現任何你需要的任何東西,雖然遠不及你想象的那麼簡單,只需使用相對座標(你的意思是,我猜是0-100%相對於幀大小)。

您可能會發現GridBagLayouthere的官方文檔,其中也包含一些數字和示例。

你也可以查看開源MiG Layout,這樣更方便GridBagLayout也有點強大。它是所有佈局經理的母親。

+0

'GridBagLayout'的用法和示例可以在這裏找到(http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html)。 – afsantos

3

JDK中最強大的佈局管理器是GridBagLayout。然而,典型的UI包含面板的組合,其中每個UI都被配置爲使用不同的佈局。例如,整個窗口的邊框佈局,包含一組按鈕的面板的流佈局,複雜零件的GridLayoutGridBagLayout

你也可以看看像MigLayout這樣的替代方案 - 非常強大的工具,可以創建幾乎任何你可以想象的視圖。

1

另一種選擇是使用SpringLayout(我個人喜歡GridBagLayout)。

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import static javax.swing.SpringLayout.*; 

public class SpringScaleTest { 
    public JComponent makeUI() { 
    SpringLayout layout = new SpringLayout(); 
    JPanel p = new JPanel(layout); 
    p.setBorder(BorderFactory.createLineBorder(Color.GREEN, 10)); 

    JLabel l1 = new JLabel("label: width=90%", SwingConstants.CENTER); 
    l1.setBorder(BorderFactory.createLineBorder(Color.RED, 1)); 
    JButton l2 = new JButton("button: width=50%"); 

    Spring panelw = layout.getConstraint(WIDTH, p); 

    SpringLayout.Constraints c1 = layout.getConstraints(l1); 
    c1.setX(Spring.constant(0)); 
    c1.setY(Spring.constant(20)); 
    c1.setWidth(Spring.scale(panelw, 0.9f)); 
    p.add(l1); 

    SpringLayout.Constraints c2 = layout.getConstraints(l2); 
    c2.setWidth(Spring.scale(panelw, 0.5f)); 
    layout.putConstraint(SOUTH, l2, -20, SOUTH, p); 
    layout.putConstraint(EAST, l2, -20, EAST, p); 
    p.add(l2); 

    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { createAndShowGUI(); } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new SpringScaleTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
}