问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求高手详细。。讲解下java awt布局里的GridBagLayout用法,小弟在此感谢...

发布网友 发布时间:2022-04-09 15:44

我来回答

3个回答

懂视网 时间:2022-04-09 20:06

GridBagLayout 不会随着窗口的变化标签随之发生变化,可固定。

----------------------------------------------------------
 
import java.awt.Button;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class GridBagEx2 extends  JPanel
{
    private static final long serialVersionUID = -5214441555967215113L;
 
    protected void makebutton(String name, GridBagLayout gridbag,
            GridBagConstraints c)
    {
        Button button = new Button(name);
        gridbag.setConstraints(button, c);
        add(button);
    }
 
    public void init()
    {
        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
 
        setFont(new Font("SansSerif", Font.PLAIN, 14));
        setLayout(gridbag);
 
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        makebutton("Button1", gridbag, c);
        makebutton("Button2", gridbag, c);
        makebutton("Button3", gridbag, c);
 
        c.gridwidth = GridBagConstraints.REMAINDER; //end row
        makebutton("Button4", gridbag, c);
 
        c.weightx = 0.0; //reset to the default
        makebutton("Button5", gridbag, c); //another row
 
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last in row
        makebutton("Button6", gridbag, c);
 
        c.gridwidth = GridBagConstraints.REMAINDER; //end row
        makebutton("Button7", gridbag, c);
 
        c.gridwidth = 1; //reset to the default
        c.gridheight = 2;
        c.weighty = 1.0;
        makebutton("Button8", gridbag, c);
 
        c.weighty = 0.0; //reset to the default
        c.gridwidth = GridBagConstraints.REMAINDER; //end row
        c.gridheight = 1; //reset to the default
        makebutton("Button9", gridbag, c);
        makebutton("Button10", gridbag, c);
 
        setSize(300, 100);
    }
 
    public static void main(String args[])
    {
        JFrame f = new JFrame("GridBag Layout Example");
        f.setLocation(400, 200);
        GridBagEx2 ex1 = new GridBagEx2();
 
        ex1.init();
 
        f.add("Center", ex1);
        f.pack();
        f.setSize(f.getPreferredSize());
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter()
        {
 
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
             
        });
    }
 
}

Java图形化界面设计——布局管理器之GridBagLayout

标签:not   rri   etl   init   bag   imp   override   height   enter   

热心网友 时间:2022-04-09 17:14

多查看API。
GridBagLayout gbl=new GridBagLayout(); 创建网格组布局

contentPane.setLayout(gbl); 使用网格组布局

GridBagConstraints gbc=new GridBagConstraints(); 创建网格组布局约束条件

gbc.insets=new Insets(0,0,5,5); 设置控件的空白
gbc.fill=GridBagConstraints.HORIZONTAL; 设置填充方式
gbc.weightx=10.0; 第一列的分布方式为10%
gbc.gridx=0; 起始点为第1列
gbc.gridy=0; 起始点为第1行
gbc.gridheight=2; 占用2列

gbc.gridwidth=2; 占用2行

contentPane.add(comp, gbc); 增加按钮及其约束条件

注意每个方法的参数和返回类型就可以了。

热心网友 时间:2022-04-09 18:32

GridBagLayout网格包布局管理器
网格包布局管理是最复杂和灵活的布局管理,在下面偶会作详细的介绍。
与网格布局管理器不同的是,网格包布局管理器允许容器中各个组件的大小各不相同,还允许组件跨越多个网格,也允许组件之间相互部分重叠。
网格包布局理解为网格单元布局更合理,因为一个容器被划分为若干个网格单元,而每个组件放置在一个或多个网格单元中。
要注意的是,网格包布局不能指定一个容器的网格单元的大小其网格单元的划分是通过weightx和weighty参数来设置的,但也不是直接指定其网格单元的大小。当把一个组件放置在网格单元中时,组件所占据的位置和大小是由一组与他们相关联的约束来决定的。这些约束是由GridBagConstraints类型的对象来设置的,关于GridBagConstraints类型,后面会做专门的介绍。
由上所述使用网格包布局的一般步骤为:
1、创建一个GridBagLayout网格包布局对象,并使其成为当前容器的布局管理器。
2、创建一个GridBagConstraints类型的约束对象,然后使用该对象设置各种约束条件,注意这里设置的约束条件并没有针对某一组件,要使某一组件具有设置的约束,需要使用第3步骤的方法。
3、然后使用GridBagLayout网格包布局中的setConstraints(Component com, GridBagConstraints cons)方法将GridBagConstraints类型对象设置的约束添加到被设置的组件中,这样该组件就具有了GridBagConstraints设置的约束。其中setConstraints()的第一个参数是将要添加的组件,第二个参数是GridBagConstraints类型的约束对象。
4、最后将设置了约束的组件添加到容器中。
使用网格包布局的第二种方法为:
1、使GridBagLayout布局成为当前容器的布局管理器,这里也可以不用创建GridBagLayout对象。
2、创建一个GridBagConstraints类型的约束对象,然后使用该对象设置约束条件。注意这里设置的约束条件并没有针对某一组件,要使某一组件具有设置的约束,需要使用第3步骤的方法。
3、然后使用add(Component com, Object cons)方法将组件和约束同时添加进容器中,这样添加进容器的组件就具有了第2步的约束。注意其中的add(Componentcom, Object cons);第一个参数是将要添加的组件,第二个参数是要添加的GridBagConstraints类型的约束对象。
GridBagConstraints类型的约束参数:
double weightx和double weighty参数(默认值为0)
这是两个非常重要的参数,该参数直接影响到怎样设置网格单元的大小,因此常握好该参数就可以对网格包布局应用自如。
该参数对x方向和y方向指定一个加权值。这个加权值直接影响到网格单元的大小,比如weightx的值分别为10,20,30,则在容器的x方向也就是列的方向,按一定的比例(比如1:2:3其具体算法请参看java文件)分配三个网格单元,其中加权值越大网格单元就越大,可以看出值的大小是没有关系的,加权值的作用是让容器以设定的值的比例在横向和纵向分配网格,且在容器的大小改变时这个比例不改变。
如果weightx只设置了一个值,而组件却不只一个以上,则被设置了的这个组件的网格单元的大小为容器在x方向的大小减去那两个组件的最小尺寸就是该组件的网格单元大小。默认情况下组件的最小尺寸是比较小的。
如果两个参数都为0(默认值),则组件会被显示在容器的*,不管容器是放大还是缩小组件都只会显示在容器的*。
由上所述,在使用网格包布局时首先应先使用weightx和weighty来划分网格单元(不是直接划分,而是按一定比例来划分),网格单元划分出来后,组件放置在网格单元中的位置和大小就由后面介绍的约束来决定。
一定要注意的是设置权值后要使当前的设置生效应使用setConstraints()函数一次,如果连续设置多个同一方向的权值,则只有最后一次设置的权值有效,比如出现同时两行都设置了x方向的权值,则以最后一行设置的x方向的权值为标准来划分网格单元。
因此在使用GridBagLayout网格包布局管理器之前应先设置好网格单元,即要把容器划分为几行几列的网格单元,每行每列在容器中的宽度和高度比例,每个组件应在哪个网格单元。
int fill参数(默认值为GridBagConstraints.NONE)
fill参数指定组件填充网格的方式,当某组件的网格单元大于组件的大小时被使用,一般情况下组件是以最小的方式被显示的,如果不使用fill参数,则有可能组件占不完整个网格单元,也就是说组件占据的空间比划分的网格单元小,这时组件将显示在网格单元中的某个位置(具体在什么位置由网格包中的参数来设置)。其可取的值如下:
GridBagConstraints.NONE默认值,不改变组件的大小。
GridBagConstraints.HORIZONTAL使组件足够大,以填充其网格单元的水平方向,但不改变高度,其值等于整数2。
GridBagConstraints.VERTICAL使组件足够大,以填充其网格单元的垂直方向,但不改变宽度,其值等于整数3。
GridBagConstraints.BOTH使组件足够大,以填充其整个网格单元,其值等于整数1。
int gridwidth和int gridheight参数(默认值为1)
该参数指定组件占据多少个网格单元,gridwidth指定组件占据多少个网格单元的宽度,gridheight指定组件占据多少个网格单元的高度。两个参数的默认值都为1。其中值GridBagConstraints.REMAINDER表示当前组件在其行或列上为最后一个组件,也就是说如果是行上的最后一个组件的话,那么下一个组件将会被添加到容器中的下一行,如果在行上不指定该值(同时也不指定gridx和gridy参数),那么无论添加多少个组件都是在同一行上,同样如果在列上不指定该值(同时也不指定gridx和gridy参数)则无论添加多少行组件,都无法把容器填满。值GridBagConstraints.RELATIVE表示当前组件在其行或列上为倒数第二个组件。
import java.awt.*;
publicclassProgram
{publicstaticvoid main(String[] args)
{ Frame ff = newFrame();
GridBagLayout gr = newGridBagLayout();
GridBagConstraints gc = newGridBagConstraints(); //创建一个名为gc的约束对象
ff.setLayout(gr); //将容器ff的布局设为GridBagLayout
//创建一组按钮组件
Button bb1 = newButton("bb1"); Button bb2 =
newButton("bb2");
Button bb3 = newButton("bb3");
Button bb4 = newButton("bb4"); Button bb5 =
newButton("bb5");
Button bb6 = newButton("bb6");
Button bb7 = newButton("bb7"); Button bb8 =newButton("bb8");

gc.fill = GridBagConstraints.BOTH;//设置约束的fill参数,该参数表示当组件的大小小于网格单元的大小时在水平和垂直方向都填充,
gc.weightx=11; //设置x方向的加权值为11。
gc.weighty= 11;//设置y方向的加权值为11。
gr.setConstraints(bb1,gc); //将以上gc所设置的约束应用到按钮组件bb1

gc.weightx= 22;//设置x方向的加权值为22,如果不设置weightx则以下的组件都将自动应用上面所设置的weightx值11。
gr.setConstraints(bb2,gc); //将以上所设置的约束应用到按钮组件bb2。
//gc.weighty=111; //注意如果不注释掉该行,则以后使用gc约束的按钮组件在y方向的加权值将为111,而在前面设置的y方向的加权值11将失去作用。
gc.weightx=33;
gc.gridwidth = GridBagConstraints.REMAINDER;//设置gridwidth参数的值为REMAINDER这样在后面使用该约束的组件将是该行的最后一个组件。
gr.setConstraints(bb3, gc); //第一行添加了三个按钮组件bb1,bb2,bb3,且这3个按钮的宽度按weightx设置的值11,22,33按比例设置宽度
GridBagConstraints gc1 = newGridBagConstraints();//创建第二个约束gc1

gc1.fill= GridBagConstraints.BOTH;
gc1.weighty= 22; //将第2行的y方向加权值设为22
gr.setConstraints(bb4,gc1);
gr.setConstraints(bb5, gc1);

gc1.gridwidth= GridBagConstraints.REMAINDER;
gr.setConstraints(bb6,gc1); //第二行添加了三个按钮组件bb4,bb5,bb6

gc1.weighty=33;
gc1.gridwidth = GridBagConstraints.REMAINDER;
gr.setConstraints(bb7, gc1);//第三行添加了一个按钮组件bb7
gc1.weighty=0;
gr.setConstraints(bb8, gc1); //第四行添加了一个按钮组件bb8,bb8并没有添加到bb7的后面,因为bb8使用了bb7前面的gridwidth参数设置的值,所以bb8也是单独的一行。

ff.setSize(500,300);
ff.add(bb1);ff.add(bb2);ff.add(bb3); ff.add(bb4); ff.add(bb5); ff.add(bb6); ff.add(bb7); ff.add(bb8);
ff.setVisible(true);} }

int gridx和int gridy参数(默认值为GridBagConstraints.RELATIVE)
该参数表示组件被添加到容器中的X或者Y坐标处,坐标以网格单元为单位,也就是说不管网格单元有多大,一个网格单元就是1X1的大小,也就是说如果把gridx和gridy都设为1,那么该组件会被显示到第二行的行二列上。其中值GridBagConstraints.RELATIVE(默认值)表示当前组件紧跟在上一个组件的后面。
int ipadx和int ipady参数(默认值为0)
ipadx和inady也被称为内部填充,该参数用以设置组件的最小尺寸,如果参数值为正值则组件的最小尺寸将比原始最小尺寸大,如果为负值,则组件的最小尺寸将会变得比原始的最小尺寸小。该参数也可以理解为直接为组件指定大小,这个设置的大小就是组件的最小尺寸。其设置后组件的大小为组件的原始最小尺寸加上ipadx*2个像素。
int anchor参数(默认值为GridBagConstraints.CENTER)
该参数指定当组件的大小小于网格单元时,组件在网格单元中的位置。一般情况下,在设置了weightx或者weighty的加权值时,如果不使用fill参数填充空白区域,则组件的大小将小于网格单元的大小,这时使用anchor参数就能看到其中的效果了。anchor参数可取的值有:GridBagConstraints.CENTER;GridBagConstraints.NORTH;GridBagConstraints.NORTHEAST;GridBagConstraints.EAST;GridBagConstraints.SOUTHEAST;GridBagConstraints.SOUTH;GridBagConstraints.SOUTHWEST;GridBagConstraints.WEST;GridBagConstraints.NORTHWEST;即居中,北,东北,东,东南,南,西南,西,西北方向。
Insets insets参数(默认值为0)
insets参数也被称为外部填充,该参数指定组件与网格单元之间的最小空白区域大小,要注意的是即使使用了fill参数填充横向和纵向但只要设置了insets参数,同样会留出insets所设置的空白区域,在insets设置的空白区域不会被填充。在使用该参数时需要设置对象的top,left,right,bottom四个方向的值来调整组件与网格单元之间的空白区域大小,比如gc.insets=newInsets(10,10,10,10);其中gc是GridBagConstraints类型的约束对象,这里要注意后面的new Insets其中的Insets第一个字母是大写的。当然也可以为insets指定负值,以扩大其网格单元。
示例:
import java.awt.*;
publicclassProgram
{publicstaticvoid main(String[] args)
{//将容器ff的布局设为GridBagLayout
Frame ff = newFrame();
GridBagLayout gr = newGridBagLayout();
GridBagConstraints gc = newGridBagConstraints(); //创建一个名为gc的约束对象
ff.setLayout(gr);
//创建一组按钮组件
Button bb1 = newButton("bb1"); Button bb2 =
newButton("bb2");
Button bb3 = newButton("bb3");
Button bb4 = newButton("bb4"); Button bb5 =
newButton("bb5");
Button bb6 = newButton("bb6");
Button bb7 = newButton("bb7"); Button bb8 =newButton("bb8");

gc.fill= GridBagConstraints.BOTH;
gc.weightx= 11; gc.weighty = 11;
gr.setConstraints(bb1,gc);

gc.weightx= 22;
gc.gridx= 1; gc.gridy = 1; //将下一个组件放置在坐标为1,1的位置。
gr.setConstraints(bb2,gc);

gc.weightx= 33;
gc.gridx= 2; gc.gridy = 1; //将下一个组件放置在坐标为2,1的位置。
gc.insets
= newInsets(-10,
-10, -10, -10); //将下一个组件与网格单元的空白区域向外扩展10个像素,在这里可以看到网格包布局允许组件之间重叠。
gc.gridwidth= GridBagConstraints.REMAINDER;
gr.setConstraints(bb3,gc);

GridBagConstraints gc1 = newGridBagConstraints();

gc1.weighty= 22;
gc1.ipadx= 50; gc1.ipady = 50; //将组件的最小尺寸加大ipadx*2个像素。
gr.setConstraints(bb4,gc1);
gc1.ipadx= 0;
gc1.ipady= 0; //将以后的组件的最小尺寸设置为默认值,如果省掉该行,则以后组件的最小尺寸都会加大ipadx*2个像素。
gc1.anchor= GridBagConstraints.NORTHWEST; //将下一个组件bb5的位置放置在单元网格的西北方向。
gr.setConstraints(bb5, gc1); //因为bb5未设置fill,同时bb5设置了weightx(由gc参数设置)和weighty两个值以确定bb5所在的网格单元的大小,因而组件bb5的原始最小尺寸无法占据整个网格单元。

gc1.fill= GridBagConstraints.BOTH;
gc1.gridwidth= GridBagConstraints.REMAINDER;
gr.setConstraints(bb6,gc1);

gc1.weighty= 33;
gc1.insets
= newInsets(5,
15,40,150); //使下一个组件bb7与网格单元之间在上,左,下,右,分别保持5,15,40,150个像素的空白位置。
gr.setConstraints(bb7,gc1);
gc1.weighty= 0;
gc1.insets
= newInsets(0,
0, 0, 0); //将insets的参数值设为默认值。
gr.setConstraints(bb8,gc1);
ff.setSize(500,300);
ff.add(bb1);
ff.add(bb2); ff.add(bb3); ff.add(bb4);
ff.add(bb5); ff.add(bb6); ff.add(bb7);
ff.add(bb8);
ff.setVisible(true);}}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
whirlpool如何制热 如何查被录取到的专业 怎样查被录取的专业 录取后怎样查询录取的专业 录取专业怎么查 已被录取怎么查专业 ghs网络语什么意思_ghs网络语意思出处含义介绍 纸箱企业管理软件 ghs什么意思网络(ghs什么意思网络用语) 《喜羊羊与灰太狼》大结局 电脑收银系统怎么查找微信支付客户? 请问客人支付钱付错了,怎么能找到那位客人? 以心中有你为话题写一篇文章 工行浙江衢州市社保卡丢了,怎么挂失? 推荐点好看励志的小说。要有意义的。 速度求一个作文的开头《心中有你》,10分钟之内给一个 推荐几本励志小说,谢谢了。。。 大家推荐几本励志小说 哪个银行收款码不收费? 求推荐一些比较有意义值得看的书,或者励志的小说。 你看过哪些励志类的小说? 有没有适合大学生阅读的商业励志书籍? 鸡脾脏能否生吃,吃了是不是对人体白细胞计数有影响? 鸡的脾脏能吃吗 杀了一只鸡,鸡脾脏有一个鸡蛋大,肝脏特大,什么毛病? 鸡的脾脏能吃吗? 鸡脾脏能否食用? 动物的脾能吃么?为什么平时我们不吃猪脾、鸡脾、鸭脾? 鸡脾脏能吃吗 这是什么鸡内脏? 成语 大什么渲染 带渲字的四字成语有哪些 带有渲字的成语有哪些 绿色渲染是成语吗? 用来形容一个人的渲染力极强的成语 带有渲字的成语有哪些(如果没有的话词语 形容过分渲染的的成语 渲染旁边的云彩是什么成语 雪对人类有什么好处? 找一个句子,里面要有“渲染”这个词语的,还要一个搭配的成语。要霸气一点的。是用来当家族宣传语的 都说“瑞雪兆丰年”,下雪有什么好处? 渲染什么? 下雪的作用是什么 冬天下雪有什么好处 鸡生的蛋壳凹凸什么原因是假的吗? 怎样用爱奇艺下载电视剧 带染成语有哪些 又下雪了,下雪有什么好处? 微信不小心把群聊删了怎么找回 鸡蛋卵壳表面为什么凸凹不平 冬天下雪的利与弊?试论证。