[英]GridBagLayout cant get layout right
I'm new to GridBagLayout but I tried to use the standard convention that I could find which was to draw out my idea on a piece of grid paper and then try and translate the grid values into gridbag... 我是GridBagLayout的新手,但我尝试使用我能找到的标准约定,即在一张网格纸上绘制我的想法,然后尝试将网格值转换为gridbag ...
my goal is to make the layout like you see below: 我的目标是制作如下所示的布局:
it currently looks like this: 它目前看起来像这样:
any idea's as to why? 任何想法为什么?
the exact dimensions i'm looking for if you think of a grid with the upper left hand corner being 0,0 for 如果你想到一个左上角为0,0的网格,我正在寻找的确切尺寸
here is my source code: 这是我的源代码:
GBC is a helper class that extends GridBagConstraints, the constructor used is GBC是一个扩展GridBagConstraints的辅助类,使用的构造函数是
GBC(int startingX,int startingY,int width,int height) GBC(int startingX,int startingY,int width,int height)
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Demo extends JApplet
{
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
JPanel panel4 = new JPanel();
JPanel panel5 = new JPanel();
public void init()
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
initComponents();
}
});
}
public void initComponents()
{
//set the layout of the content pane to gridbag layout
GridBagLayout gridBag = new GridBagLayout();
getContentPane().setLayout(gridBag);
Rectangle rect = getContentPane().getBounds();
panel1.setBackground(Color.green);
panel2.setBackground(Color.black);
panel3.setBackground(Color.red);
panel4.setBackground(Color.orange);
panel5.setBackground(Color.yellow);
add(panel4, new GBC(10, 0, 16, 7).setFill(GBC.BOTH).setWeight(1.0, 1.0));
add(panel1, new GBC(0, 0, 10, 1).setFill(GBC.BOTH).setWeight(1.0, 1.0));
add(panel3, new GBC(0, 21, 10, 1).setFill(GBC.BOTH).setWeight(1.0, 1.0));
add(panel2, new GBC(0, 1, 10, 20).setFill(GBC.BOTH).setWeight(1.0, 1.0));
add(panel5, new GBC(10, 7, 16, 16).setFill(GBC.BOTH).setWeight(1.0, 1.0));
}
}
any help would be appreciated (but please explain your logic) 任何帮助将不胜感激(但请解释你的逻辑)
Well you can easily accomplish this by using a GridBagLayout
. 那么你可以通过使用GridBagLayout
轻松实现这一点。
Considering contentPane
with GridBagLayout
as its layout, you can divide the JPanel
into three parts now. 考虑使用GridBagLayout
作为布局的contentPane
,您现在可以将JPanel
分为三个部分。 A single left side JPanel
(with GridBagLayout, and which will contain those RED
, BLACK
and BLUE
JPanel
s), and the right side consisting of two JPanel
s, ie GREEN
and MAGENTA
. 一个左侧JPanel
(带有GridBagLayout,它将包含那些RED
, BLACK
和BLUE
JPanel
),右侧包含两个JPanel
,即GREEN
和MAGENTA
。
------------------------
| left | green JPanel |
| JPanel |______________|
| with |magenta Jpanel|
|3 JPanel | |
|________________________|
Now the left JPanel
will place RED
, BLACK
and BLUE
JPanel
on itself, with GridBagLayout
as its Layout Manager
with RED and BLUE
having weighty = 0.1
, and BLACK
having weighty = 0.8
现在左边的JPanel
将自己放置RED
, BLACK
和BLUE
JPanel
, GridBagLayout
作为Layout Manager
, RED and BLUE
weighty = 0.1
,而BLACK
weighty = 0.8
See this example code : 请参阅此示例代码:
import java.awt.*;
import javax.swing.*;
public class GridBagExample {
private JPanel leftPanel;
private JPanel redPanel;
private JPanel blackPanel;
private JPanel bluePanel;
private JPanel greenPanel;
private JPanel magentaPanel;
private GridBagConstraints gbc;
public GridBagExample() {
gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
}
private void displayGUI() {
JFrame frame = new JFrame("GridBagLayout Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel(new GridBagLayout());
leftPanel = getPanel(Color.WHITE);
leftPanel.setLayout(new GridBagLayout());
redPanel = getPanel(Color.RED.darker());
blackPanel = getPanel(Color.BLACK);
bluePanel = getPanel(Color.CYAN.darker().darker());
greenPanel = getPanel(Color.GREEN.darker().darker());
magentaPanel = getPanel(Color.MAGENTA);
/**
* @param :
* leftPanel : JPanel (with GridBagLayout), on which
* all other components will be placed.
* redPanel : JPanel, which will be added to the leftPanel
* 0 : specifies the grid X, which in this case is 0
* 0 : specifies the grid Y, which in this case is 0
* 1 : specifies the width for this grid (cell), we keeping
* this default as 1
* 1 : specifies the height for this grid (cell), we keeping
* this default as 1
* GridBagConstraints.BOTH : allows JPanel to expand in both
* directions as the containing container expands (in
* this case redPanel will expand both HORIZONTALLY and
* VERTICALLY, as leftPanel will expand)
* weightx : This is the actual width the redPanel will occupy
* relative to all other components on the leftPanel
* weighty : This is the actual height the redPanel will occupy
* relative to all other components on the leftPanel
*/
addComp(leftPanel, redPanel, 0, 0, 1, 1,
GridBagConstraints.BOTH, 1.0, 0.1);
addComp(leftPanel, blackPanel, 0, 1, 1, 1,
GridBagConstraints.BOTH, 1.0, 0.8);
addComp(leftPanel, bluePanel, 0, 2, 1, 1,
GridBagConstraints.BOTH, 1.0, 0.1);
addComp(contentPane, leftPanel, 0, 0, 1, 2,
GridBagConstraints.BOTH, 0.5, 1.0);
addComp(contentPane, greenPanel, 1, 0, 1, 1,
GridBagConstraints.BOTH, 0.5, 0.3);
addComp(contentPane, magentaPanel, 1, 1, 1, 1,
GridBagConstraints.BOTH, 0.5, 0.7);
frame.setContentPane(contentPane);
/*
* Once you will add components to these
* JPanels, then use pack(), instead of
* setSize(). The use of the latter is
* just for illustration purpose only
*/
//frame.pack();
frame.setSize(300, 300);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private void addComp(JPanel panel, JComponent comp,
int x, int y, int width, int height,
int fill, double weightx, double weighty) {
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = height;
gbc.fill = fill;
gbc.weightx = weightx;
gbc.weighty = weighty;
panel.add(comp, gbc);
}
private JPanel getPanel(Color backColor) {
JPanel panel = new JPanel();
panel.setOpaque(true);
panel.setBackground(backColor);
return panel;
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new GridBagExample().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
Here is the output of the same : 这是相同的输出:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.