2013-02-08 312 views
2

我想使這個佈局中的java:哪個佈局管理器可以在Java中進行佈局?

enter image description here

南北標籤很容易通過BorderLayout的實現。但其餘的應該進入中心位置。所以我試圖把CENTER分成左右兩個網格,把左邊的網格劃分成3個不同的網格,但是它們不在我想要的位置,看起來也很複雜。也許有一個更簡單的方法。

有沒有人有任何想法?

+1

請,一切都取決於什麼,這和h ow將可調整大小與容器,其他任何東西,無論是隻有一半問及回答問題 – mKorbel 2013-02-08 19:40:35

+1

GridBagLayout或複合面板/佈局 – MadProgrammer 2013-02-08 19:41:59

回答

3

爲了解決這種情況,我所做的是這樣的:

1. The content pane will have the BorderLayout, the top JLabel and 
    the bottom JLabel will go to their respective places using the 
    BorderLayout's PAGE_START and PAGE_END constraints. Now the 
    CENTER area is occupied by the BasePanel. 
2. The BasePanel will have GridLayout (1 Rows, 2 Columns), with two 
    JPanel, left and right. 
3. Here right JPanel will have a GridLayout (3 Rows, 1, Columns 
    , 10 HorizontalGap, 10 VerticalGap). 
4. Left JPanel will have GridBagLayout with two JPanels one for 
    GRID 0, 0 and other for GRID 0, 1. 
5. The JPanel at Grid 0, 0 will have GridBagLayout, for JTextField 
    and the JLabel. 
6. The JPanel at Grid 0, 1 will have BorderLayout one for 
    JTextArea and one for another JPanel with GridLayout having 
    2 JRadioButtons. 

下面是代碼,執行一個指定的輸出上面的任務:

import javax.swing.*; 
import java.awt.*; 
import java.util.Random; 

/** 
* Created with IntelliJ IDEA. 
* User: Gagandeep Bali 
* Date: 2/10/13 
* Time: 1:23 PM 
* To change this template use File | Settings | File Templates. 
*/ 
public class LayoutExample 
{ 
    private JTextField tField; 
    private JTextArea tArea1; 
    private JTextArea tArea2; 
    private JTextArea tArea3; 
    private JTextArea tArea4; 

    private JRadioButton leftRButton; 
    private JRadioButton rightRButton; 

    private GridBagConstraints gbc; 

    private Random random; 

    public LayoutExample() 
    { 
     gbc = new GridBagConstraints(); 
     random = new Random(); 
    } 


    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Nested Layout Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel contentPane = getPanel(); 
     contentPane.setLayout(new BorderLayout(5, 5)); 
     JLabel topLabel = new JLabel(
         "PAGE_START Label", JLabel.CENTER); 
     contentPane.add(topLabel, BorderLayout.PAGE_START); 

     JPanel basePanel = getPanel(); 
     basePanel.setLayout(new GridLayout(1, 2)); 

     JPanel leftPanel = getPanel(); 
     leftPanel.setLayout(new GridBagLayout()); 
     leftPanel.setBorder(
       BorderFactory.createEmptyBorder(
         10, 10, 10, 10)); 
     JLabel fieldLabel = new JLabel("Label", JLabel.CENTER); 
     tField = new JTextField(20); 

     JPanel topPanel = getPanel(); 
     topPanel.setLayout(new GridBagLayout()); 
     topPanel.add(fieldLabel, getConstraints(
          0, 0, 1, 1 
       , GridBagConstraints.HORIZONTAL, 0.3f, 0.1f)); 
     topPanel.add(tField, getConstraints(
          1, 0, 2, 1 
       , GridBagConstraints.HORIZONTAL, 0.7f, 1.0f)); 
     leftPanel.add(topPanel, getConstraints(
         0, 0, 1, 1 
         , GridBagConstraints.BOTH, 1.0f, 0.40f)); 

     JPanel middlePanel = getPanel(); 
     middlePanel.setLayout(new BorderLayout(5, 5)); 
     tArea1 = new JTextArea(10, 10); 
     middlePanel.add(tArea1, BorderLayout.CENTER); 
     JPanel radioPanel = getPanel(); 
     radioPanel.setLayout(new GridLayout(1, 2, 5, 5)); 
     leftRButton = new JRadioButton("Left", false); 
     rightRButton = new JRadioButton("Right", false); 
     radioPanel.add(leftRButton); 
     radioPanel.add(rightRButton); 
     middlePanel.add(radioPanel, BorderLayout.PAGE_END); 
     leftPanel.add(middlePanel, getConstraints(
           0, 1, 1, 2 
          , GridBagConstraints.BOTH, 1.0f, 0.60f)); 
     basePanel.add(leftPanel); 

     JPanel rightPanel = getPanel(); 
     rightPanel.setLayout(new GridLayout(0, 1, 10, 10)); 
     rightPanel.setBorder(
       BorderFactory.createEmptyBorder(
            10, 10, 10, 10)); 
     tArea2 = new JTextArea(10, 10); 
     tArea3 = new JTextArea(10, 10); 
     tArea4 = new JTextArea(10, 10); 
     rightPanel.add(tArea2); 
     rightPanel.add(tArea3); 
     rightPanel.add(tArea4); 
     basePanel.add(rightPanel); 
     contentPane.add(basePanel, BorderLayout.CENTER); 

     JLabel bottomLabel = new JLabel(
       "PAGE_END Label", JLabel.CENTER); 
     contentPane.add(bottomLabel, BorderLayout.PAGE_END); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private JPanel getPanel() 
    { 
     JPanel panel = new JPanel(); 
     panel.setOpaque(true); 
     panel.setBackground(new Color(random.nextFloat() 
          , random.nextFloat(), random.nextFloat() 
               , random.nextFloat())); 
     panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 

     return panel; 
    } 

    private GridBagConstraints getConstraints(
          int x, int y, int w, int h, int fillValue 
             , float weightx, float weighty) 
    { 
     //GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
     gbc.fill = fillValue; 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = w; 
     gbc.gridheight = h; 
     gbc.weightx = weightx; 
     gbc.weighty = weighty; 

     return gbc; 
    } 

    public static void main(String... args) 
    { 
     Runnable runnable = new Runnable(){ 
       @Override 
       public void run() 
       { 
        new LayoutExample().displayGUI(); 
       } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 
} 

這裏是輸出相同的:

NESTED LAYOUT

+0

與嵌套容器一樣,問題是正確的對齊方式(fi文本框的上邊框與右邊的textarea的上邊角不對齊,右邊框與下面的textarea的右邊角不對齊)時間爲了解決這些問題(一遍又一遍)更好地投資學習一個非常好的layoutManager,它可以在一個面板中處理複雜的佈局,然後始終使用它。我的0.02美分:-) – kleopatra 2013-02-10 11:11:20

+0

刪除了'JTextField'和'JTextArea'的一些對齊問題。使用'GridBagLayout'而不是'FlowLayout'。 – 2013-02-10 15:25:14

1

,因爲你需要的想法,那就是:

  • 創建兩個PANAL左,右。

      左側面板上
    • 具有FlowLayout

    • 右面板中添加JTA1與添加JTF與BorderLayout.NORTH

    • 左側面板與BorderLayout.CENTER
    • 左側面板上添加JTA添加單選按鈕BorderLayout.NORTH

    • 右側面板上BorderLayout.CENTER
    • 右面板中的添加JTA2與添加JTABorderLayout.BOTTOM
+2

要添加到此,利用prefferedSizes,以便您可以確保它們正確適合。 – 2013-02-08 19:45:20

+0

@Legend_take preferredSizes_的優勢 - 這是什麼意思? – kleopatra 2013-02-10 11:04:05

+0

我很清楚api(順便說一句:你鏈接到的文檔是過時的) - 但是這並不回答我的評論中的問題:你是什麼意思** by_take advantageSizes_ – kleopatra 2013-02-10 12:37:33

2

BorderLayout你外佈局。

NORTHSOUTH是各自的標籤。

EASTCENTER應分配一個嵌套Panel,對其分配BoxLayout,或單柱GridLayout或其他BorderLayout(使用NORTHCENTERSOUTH),你把你的3 JTextAreas

WEST(或CENTER如果EAST在事先的步驟中使用)可以與另一個嵌套Panel完成的,可以使用一GridBagLayoutGroupLayout

查看更多信息here