我想在java中创建这个布局:
BorderLayout很容易实现NORTH和SOUTH标签。但其余的应该进入CENTER位置。所以我试图将CENTER划分为左右网格,并将左网格划分为3个不同的网格,但它们不会停留在我想要的位置,看起来也很复杂。也许有一种更简单的方法。
有没有人有任何想法?
答案 0 :(得分: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);
}
}
以下是相同的输出:
答案 1 :(得分:2)
BorderLayout
为您的外部布局。
NORTH
和SOUTH
是您各自的标签。
EAST
或CENTER
分配一个嵌套Panel
,您可以为其分配BoxLayout
,或单列GridLayout
,或另一个BorderLayout
1}}(使用NORTH
,CENTER
和SOUTH
)放置3 JTextAreas
。
WEST
(或CENTER
如果前一步骤中使用EAST
)可以使用另一个嵌套Panel
完成,分配GridBagLayout
或{ {1}}。
查看更多信息here。
答案 2 :(得分:1)
因为你需要这个想法,这里是:
左右创造两个panal。
使用FlowLayout添加单选按钮
使用BorderLayout.NORTH添加JTA1