2015-05-30 51 views

回答

3

給出BorderLayout.CENTER JPanel a new GridLayout(2, 1)(對於2行,1列)。爲上半部分的空白空間添加一個空白的JLabel到相同的JPanel。將另一個組件JPanel添加到JPanel的BorderLayout.CENTER,並使用GridBagLayout作爲底部空間,然後使用GridBagConstraints添加標籤和字段。這裏的祕訣是嵌套JPanels,每個都使用選擇的佈局管理器。

例如:

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 

import javax.swing.*; 

public class Layouts { 
    private static final int TF_COLS = 8; 

    private static void createAndShowGui() { 
     JPanel borderLayoutPanel = new JPanel(new BorderLayout()); 
     borderLayoutPanel.setBorder(BorderFactory 
      .createTitledBorder("BorderLayout Panel")); 

     borderLayoutPanel.add(createInnerPanel("North"), BorderLayout.PAGE_START); 

     borderLayoutPanel.add(createInnerPanel("North"), BorderLayout.PAGE_START); 
     borderLayoutPanel.add(createInnerPanel("South"), BorderLayout.PAGE_END); 
     borderLayoutPanel.add(createInnerPanel("East"), BorderLayout.LINE_END); 
     borderLayoutPanel.add(createInnerPanel("West"), BorderLayout.LINE_START); 

     JPanel centerPanel = new JPanel(new GridLayout(2, 1)); 
     centerPanel.add(new JLabel()); 

     JPanel gblPanel = new JPanel(new GridBagLayout()); 
     gblPanel.add(new JLabel("Question 1:"), createGbc(0, 0)); 
     gblPanel.add(new JTextField(TF_COLS), createGbc(1, 0)); 
     gblPanel.add(new JLabel("Question 2:"), createGbc(0, 2)); 
     gblPanel.add(new JTextField(TF_COLS), createGbc(1, 2)); 

     centerPanel.add(gblPanel); 

     borderLayoutPanel.add(centerPanel); 

     JFrame frame = new JFrame("Layouts"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(borderLayoutPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private static GridBagConstraints createGbc(int x, int y) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = 1; 
     gbc.gridheight = 1; 
     gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     int iGap = 5; 
     gbc.insets = (x == 0) ? new Insets(iGap, iGap, iGap, 3 * iGap) : new Insets(
      iGap, iGap, iGap, iGap); 
     return gbc; 
    } 

    private static JComponent createInnerPanel(String text) { 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel(text)); 
     panel.setBorder(BorderFactory.createEtchedBorder()); 
     return panel; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

是的,這是比簡單的設置範圍更最初的工作,但如果你最終節省時間和挫折是當你有後來因爲如果你使用正確的保持這種GUI佈局,調試,增強或改變GUI會更容易。它也將有更好的機會在所有平臺和屏幕分辨率上體面。

+0

太棒了!我看到你在說什麼,所以我可以在我的'BorderLayout.CENTER'裏面有一個'GridLayout'? –

+0

@ScruffyNerfherder:例如 - 請參閱代碼。 –

+0

好的,太棒了!非常感謝你,我想我明白了! –

-1

我通常使用一套界限,但隨時看其他佈局一樣,它允許你做出這樣的佈局,你可以把特定組件在網格中的GridBagLayout。看看這個鏈接,看看是什麼好像。 https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

+0

酷,我會檢查了這一點。謝謝! –

+0

*「我通常使用set bounds ..」*答案不應包含那個(壞)建議,更不用說從頭開始。 –

+0

那麼我確實建議網格袋佈局作爲更好的選擇... – Raheel138

2

這是很容易與EmptyBorder完成:

centerPanel.setBorder(new EmptyBorder(top, left, bottom, right));