2013-02-08 121 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