java界面设计,java界面设计工具

发布时间:2023-01-07

本文目录一览:

  1. 用Java语言设计一个界面,
  2. eclipse怎么进行 可视化java界面设计?
  3. 简述java程序设计中界面设计中的三种布局方式
  4. java用户登录界面的设计?
  5. 用java设计一个简单的界面设计,越简单越好,谢谢

用Java语言设计一个界面,

首先:采用什么技术实现 java语言可以使用awt 和swing等技术实现图形界面 推荐使用Swing,因为Swing比AWT更专业,更漂亮,组件更丰富,功能更强大。 2. 其次:分析采用什么布局 边界布局BorderLayout,配合表格布局GridLayout,既简单又美观 3. 最后:分析需求中需要用的组件 学生姓名 学号 显示信息 需要用到文本框JTextField 单选按钮 需要用到组件 JRadioButton 复选框 需要用到组件 JCheckBox 组合框 需要用到组件 JComboBox 图片效果 参考代码如下

//导入所需要的包
import java.awt.event.*;
import javax.swing.border.*;
import javax.swing.*;
import java.awt.*;
public class ClassFrame extends JFrame {// 写一个类继承自JFrame 窗体
    // 定义组件
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextField tfName, tfNum, allInfo;
    private JRadioButton rb1, rb2;
    private JCheckBox cb1, cb2, cb3;
    private JComboBox<String> t1, t2, t3;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ClassFrame frame = new ClassFrame();// 创建一个窗口实例
                    frame.setVisible(true);// 让该窗口实例可见
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * 窗口属性的设置,内部组件的初始化
     */
    public ClassFrame() {
        setTitle("选课ing...");//标题
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置关闭是退出JVM
        setSize(450, 339);// 设置窗体大小
        setLocationRelativeTo(null);// 窗体居中
        contentPane = new JPanel();// 内容面板
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));// 设置布局
        setContentPane(contentPane);
        JPanel panel = new JPanel(new GridLayout(5, 1, 5, 10));//5行1列的表格布局
        panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
        contentPane.add(panel, BorderLayout.CENTER);//给panel添加边框
        JPanel panel_1 = new JPanel();
        panel.add(panel_1);
        JLabel label = new JLabel("姓名");
        panel_1.add(label);
        tfName = new JTextField();
        panel_1.add(tfName);
        tfName.setColumns(10);
        JLabel label_2 = new JLabel("学号");
        panel_1.add(label_2);
        tfNum = new JTextField();
        tfNum.setColumns(10);
        panel_1.add(tfNum);
        rb1 = new JRadioButton("男");
        panel_1.add(rb1);
        rb1.setSelected(true);//设置单选按钮中,默认选择的按钮
        rb2 = new JRadioButton("女");
        panel_1.add(rb2);
        ButtonGroup bts = new ButtonGroup();//单选按钮需要加入同一个ButonGroup中才能生效
        bts.add(rb1);
        bts.add(rb2);
        JPanel panel_2 = new JPanel();
        panel.add(panel_2);
        cb1 = new JCheckBox("高等数学");
        panel_2.add(cb1);
        t1 = new JComboBox<String>();
        t1.setModel(new DefaultComboBoxModel<String>(new String[] { "林老师", "赵老师", "孙老师" }));
        panel_2.add(t1);
        JPanel panel_3 = new JPanel();
        panel.add(panel_3);
        cb2 = new JCheckBox("世界经济");
        panel_3.add(cb2);
        t2 = new JComboBox<String>();
        t2.setModel(new DefaultComboBoxModel<String>(new String[] { "张老师", "刘老师" }));
        panel_3.add(t2);
        JPanel panel_4 = new JPanel();
        panel.add(panel_4);
        cb3 = new JCheckBox("音乐赏析");
        panel_4.add(cb3);
        t3 = new JComboBox<String>();
        t3.setModel(new DefaultComboBoxModel<String>(new String[] { "王老师", "周老师" }));
        panel_4.add(t3);
        JPanel panel_5 = new JPanel();
        panel.add(panel_5);
        JButton jbOk = new JButton("确定");
        panel_5.add(jbOk);
        JButton jbRest = new JButton("重填");
        panel_5.add(jbRest);
        JPanel panelSouth = new JPanel();
        contentPane.add(panelSouth, BorderLayout.SOUTH);
        JLabel labe = new JLabel("选课信息");
        labe.setHorizontalAlignment(SwingConstants.LEFT);
        panelSouth.add(labe);
        allInfo = new JTextField();
        allInfo.setColumns(30);
        panelSouth.add(allInfo);
        JPanel panelNorth = new JPanel();
        contentPane.add(panelNorth, BorderLayout.NORTH);
        JLabel labelTitle = new JLabel("学生选课界面");
        labelTitle.setForeground(Color.DARK_GRAY);
        labelTitle.setFont(new Font("宋体", Font.BOLD, 20));
        panelNorth.add(labelTitle);
        //给确定按钮添加事件处理代码
        jbOk.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                StringBuilder info = new StringBuilder();
                String name = tfName.getText();
                String num = tfNum.getText();
                String sex;
                if (rb1.isSelected()) {
                    sex = "男";
                } else {
                    sex = "女";
                }
                info.append(name + num + sex);
                if (cb1.isSelected()) {
                    String c = cb1.getText();
                    String t = t1.getSelectedItem().toString();
                    info.append(" " + c + t);
                }
                if (cb2.isSelected()) {
                    String c = cb2.getText();
                    String t = t2.getSelectedItem().toString();
                    info.append(" " + c + t);
                }
                if (cb3.isSelected()) {
                    String c = cb3.getText();
                    String t = t3.getSelectedItem().toString();
                    info.append(" " + c + t);
                }
                allInfo.setText(info.toString());//把学生信息和选课信息放到文本框
            }
        });
        //给重填按钮 设置事件处理代码
        jbRest.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tfName.setText("");
                tfNum.setText("");
                rb1.setSelected(true);
                cb1.setSelected(false);
                t1.setSelectedIndex(0);
                cb2.setSelected(false);
                t2.setSelectedIndex(0);
                cb3.setSelected(false);
                t3.setSelectedIndex(0);
                allInfo.setText("");
            }
        });
    }
}

eclipse怎么进行 可视化java界面设计?

准备工作:

  1. 下载JDK;
  2. 下载Eclipse;
  3. 下载相应的EMF、GEF、VE; 开始安装:
  4. 安装JDK; 这个比较容易,标准的Windows安装程序,下一步,再下一步即可,安装完成后,也不需要重启。
  5. 安装Eclipse; Eclipse是绿色软件,不需要安装,只需要解压缩,然后即可运行。 为了说明方便,我把它解压缩到C盘根目录下,得到C:\eclipse目录,运行C:\eclipse\eclipse.exe即可。 注意:下面的安装,需要先关闭eclipse程序。
  6. 安装EMF、GEF、VE; 对于Eclipse来说,这些都是它的插件,所以,安装方法都是一样的。插件下载地址 A. 在C:\eclipse目录下,建立四个子目录:C:\eclipse\emf、C:\eclipse\gef、C:\eclipse\ve、C:\eclipse\links; B. 把下载的EMF、GEF、VE都解压缩到相应的目录中,即:把EMF压缩包解压缩到C:\eclipse\emf中,得到C:\eclipse\emf\eclipse目录,以此类推,完成GEF、VE的解压缩; C. 在C:\eclipse\links目录下,新建一个文本文件,名字可随便取,如:link.txt。 然后在link.txt文件中,加入以下三行文字:
path=emf
path=gef
path=VE

简述java程序设计中界面设计中的三种布局方式

边框布局

JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new FlowLayout());

单词layout的中文意思是“布局”、“布置”,setLayout就是设置布局格式。也就是说,容器panel1的方法setLayout是用来设置布局格式的。那么,我们一直用的是什么模式呢?对,就是后面括号里的FlowLayout()。顾名思义,也就是流布局方式。这是一种顺其自然的方式:从左到右,一个个对象地摆放,摆不下,就摆到下一行。所以,我们就无法去控制它。 从本章开始,我们就要学习一种控制布局的方法。在Java语言中,提供了各种布局管理器,以便大家能够达到这一目的。 通常我们最常使用的布局管理器是:Border Layout(边框布局管理器),如下图所示,边框布局管理器将一个屏幕分成了五个部分:东、南、西、北、中。 如果要使用这种边框布局管理进行布局控制,我们必须先将“容器”设置为“边框布局控制模式”,具体来说,就是当调用setLayout方法为容器设置布局控制模式时,参数设置为BorderLayout。例如:

JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new BorderLayout());

然后,我们就可以在使用容器的add方法添加部件时,附加上位置参数,使得该部件显示在指定的位置上。位置参数分别是:

  • BorderLayout.NORTH 位置为北
  • BorderLayout.SOUTH 位置为南
  • BorderLayout.EAST 位置为东
  • BorderLayout.WEST 位置为西
  • BorderLayout.CENTER 位置为中心

实例说明

下面,我们就来试一试,使用按钮排出五个方向!请创建一个testBorder.java,输入以下源程序:

import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testBorder extends JApplet {
    public void init() {
        JPanel panel1=(JPanel)getContentPane();
        panel1.setLayout(new BorderLayout());
        JButton north=new JButton("North");
        JButton south=new JButton("South");
        JButton east=new JButton("East");
        JButton west=new JButton("West");
        JButton center=new JButton("Center");
        panel1.add(north,BorderLayout.NORTH);
        panel1.add(south,BorderLayout.SOUTH);
        panel1.add(east,BorderLayout.EAST);
        panel1.add(west,BorderLayout.WEST);
        panel1.add(center,BorderLayout.CENTER);
    }
}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面 为了试一下,如果并没有在每个位置都安排一个部件,那么会怎么样呢?我们修改一下程序,将panel1.add(west,BorderLayout.WEST);这一行注释掉(就是在前面加上“//”号),也就是不显示西边的按钮,看一下结果如何。正如上图(图10-3)所示,西边由于没有部件,因此“中”就朝西靠,“占领”了它的位置。 而如果我们修改一下程序,让中间的按钮不显示的话,就会出现如图10-5的样子,中间的区域并未并占领,而是空在那里了!这是与其它位置不同的地方,大家一定要记住。

一些提示:

其实这很好理解,如果中间的那一块的位置被其它位置上的部件占领的话,就会使得分不清“东”、“南”、“西”、“北”了。倒成了“左上角”、“左下角”、“右上角”、“右下角”了。

网格布局

实例说明

下面,我们来看一个新的程序!首先创建一个testGrid.java文件,并输入以下源程序:

import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testGrid extends JApplet {
    String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",
        "No.6","No.7","No.8","No.9"};
    public void init() {
        JPanel panel1=(JPanel)getContentPane();
        panel1.setLayout(new GridLayout(3,3));
        for (int x=0; x<9; x++) {
            panel1.add(new JButton(buttonLabels[x]));
        }
    }
}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面 我们主要是关心如何摆放各个部件,而不是如何构建一个程序。所以,正如本例中的按钮一下,这一章中的所有部件都是一个样子,没有任何作用。这样也使得程序尽可能地变短了,更易于大家阅读和理解程序。 下面,我们就一起来看一下上面的这个程序。

String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5", "No.6","No.7","No.8","No.9"}

我想大家都能很轻松地读懂这条语句,我们在此定义了一个字符串数组buttonLabels,它有9个字符串成员,也就是我们后面定义的9个按钮的标签文本。
值得注意的是,大家一定要知道,buttonLabels[1]表示哪个字符串!如果您的答案是“No.1”的话,就错了!正确的答案是“No.2”,这是因为在数组中索引值是从0开始的,也就是说如果要使用“No.1”的话,应该使用buttonLabels[0]。这对更好地理解后面的程序十分重要,也是基本功之一。
2. ```java
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridLayout(3,3));

在这两行程序中,我们首先定义了一个容器部件panel1。然后调用setLayout方法设置布局管理器。这里我们使用了一个新的布局管理器:GridLayout,网格布局管理器。 我们注意到GridLayout的后面带了两个参数:3,3。这有什么用呢?我们一起来看一下GridLayout方法的定义:

public GridLayout (int rows,int cols)

我们看一下这两个参数,首先它们都是int型—整型的。那么它们分别起到什么作用呢?我们还是采用顾名思义法吧!row的中文意思是行,col的中文意思是列,后面加上一个s,是这两个单词的复数形式。 好,我们现在串起来想一下,我们定义了一个网格布局,然后定了它的行、列数!这不就画出了这个网格了吗?如果我们在语句是使用GridLayout(5,5)的话,就会把整个容器分成25个单元 而我们在程序中使用的是GridLayout(3,3),所以它就将整个容器分成了

注意:

这种划分是一种逻辑上的,暗藏式的划分,而不会把格子给划出来。另外,我们这里举的两个例子行、列都相等,其实完全可以不等。 3. ```java for (int x=0; x<9; x++) { panel1.add(new JButton(buttonLabels[x])); }

这是一个循环结构的程序。我们先看循环语句,循环的初值是“x=0”,继续执行循环的条件语句是“x<9”。循环体是panel1.add(new JButton(buttonLabels[x]));。
我们先看循环语句,循环的初值是“x=0”,继续执行循环的条件语句是“x<buttonLabels.length”。循环体是panel1.add(new JButton(buttonLabels[x]));。
别忘了,我们使用buttonLabels[0]表示第一个字符串,buttonLabels[1]表示第二个字符串……,那么最后一个字符串就应该是buttonLabels[buttonLabels.length-1]嘛。
在循环中,我们使用容器提供的add方法,将新定义的按钮部件添加进去。
有时,我们可能想获得象下图所示的布局效果!让各个部件之间存在一些间隙。使用Java的网格布局可以实现吗?
我很高兴地回答你:“可以!”,我们可以使用GridLayout的另一种构造器方法(签名不同)来实现:
```java
public GridLayout (int rows,int cols,int hgap,int vgap)

在这个方法中,可以带上四个整型参数,前两个我们已经很熟悉了,行数与列数。后面则是两个新的参数。 第一个是hgap,其中gap的意思是间隙、空隙的意思,而h则是horizontal(水平)的第一个字母。也就是说,我们可以通过hgap参数设置横向的间隙。 第二个是vgap,v则是vertical(垂直)的第一个字母。也就是说,我们可以通过vgap参数设置纵向的间隙。

自测练习

  1. _________________是网格布局管理器。 a. BorderLayout
    b. GridLayout
    c. ReseauLayout
    d. FlowLayout
    利用以下代码回答问题2、3、4、5:
  2. 这个布局中有__________行? a. 7行
    b. 5行
    c. 6行
    d. 8行
  3. 这个布局中有__________列? a. 7行
    b. 5行
    c. 6行
    d. 8行
  4. 这个布局将容器分为_________个部分? a. 48个
    b. 35个
    c. 30个
    d. 40个
  5. 第5个部件位于__________位置。 a. 左上角
    b. 左下角
    c. 右上角
    d. 右下角
    e. 中间
  6. 根据以下界面,编写一个程序 图10-12 练习题图
    ____________________________________________________________________
    ____________________________________________________________________
    ____________________________________________________________________
    ____________________________________________________________________
    ____________________________________________________________________
    
  7. 如果我们构建一个5*5的网格布局,但只在该容器中加入17个按钮,将会出现什么情况?请编写一个程序,来试一试效果。
    ____________________________________________________________________
    ____________________________________________________________________
    ____________________________________________________________________
    ____________________________________________________________________
    

练习答案

  1. b 没什么好解释的,请大家记住!
  2. a 第一个参数是行数,因此是7行。
  3. b 第二个参数是列数,因此为5列。
  4. b 7行5列,其7*5,35个部分嘛。
  5. c 第5个部件是第一行的最后一个,当然在右上角嘛。
  6. 下面是一个实现的程序实例:
    import java.awt.*;
    import javax.swing.*;
    import java.applet.Applet;
    public class lianxi10_2 extends JApplet {
        String buttonLabels[]={"1","2","3","4","5","6","7",
            "8","9","*","0","#"};
        public void init() {
            JPanel panel1=(JPanel)getContentPane();
            panel1.setLayout(new GridLayout(4,3,10,10));
            for (int x=0; x<12; x++) {
                panel1.add(new JButton(buttonLabels[x]));
            }
        }
    }
    
  7. 下面是一个实现的程序实例:
    import java.awt.*;
    import javax.swing.*;
    import java.applet.Applet;
    public class lianxi10_3 extends JApplet {
        String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",
            "No.6","No.7","No.8","No.9","No.10","No.11","No.12",
            "No.13","No.14","No.15","No.16","No.17"};
        public void init() {
            JPanel panel1=(JPanel)getContentPane();
            panel1.setLayout(new GridLayout(5,5));
            for (int x=0; x<17; x++) {
                panel1.add(new JButton(buttonLabels[x]));
            }
        }
    }
    

这个程序使用javac编译完后,编写一个包含这个类的HTML页面,再用appletviewer来观察发现运行结果如下图所示: 图10-13 练习答案图 这个输出是不是令你感到十分意外,整个程序根本不按要求分成5列,所以我们从这里得到一个使用网格布局中要十二分注意的一点:“请别忘了将网格填满”。否则程序的输出将不可预料。

一些提示:

如果你真的没有那么多东西来“占领”网格的话,我建议你使用一个空标签来填补这个空白的网格,使得程序的输出如你所愿。使用空标签的方法很容易:

panel1.add(new Label(""));

从这里,我们也看出了,我们学习过的流布局管理器、边框布局管理器,以及我们刚学习过的网格布局管理器都比较死板,不够高级。

组合布局

传授新知

正如我们在上一小节结束的时候说的一样,各种布局管理器都有自己的缺点,没有一种能够真正地完全满足我们编写GUI程序时的要求。 而在Java语言中,允许在容器中加入其他容器,这样每个容器可以根据自己的需要采用不同的布局管理器,组合成为一个我们所需要的GUI程序界面。这种方法,我们就称之为组合布局。

注意:

与流布局、边框布局、网格布局不同,组合布局并不是一个新的布局管理器,它是通过结合各种布局管理器的优点,将它们组合地应用在GUI程序界面的开发中。这是一种布局管理的方法。也可以说是一种GUI程序界面的开发技巧。 当我们设计GUI程序界面时,最好先在纸上把它画出来,然后“分块解决”。也就是将能够组合在一起的部件找出来,将它们放在一个容器里,并为它们选择合适的布局管理器。然后把这些容器摆放在一起,就解决了。 设计时还要考虑到窗体大小发生改变的时候,引起的部件形体变化。这方面,请你熟记几个设计技巧:

  1. 对于那些要求扁平状的部件,我们应该将它放置在边框布局中的南面或北面;
  2. 对于那些要求细高状的部件,我们应该将它放置在边框布局中的东面或西面;
  3. 对于那些可以随着窗体改变大小部分,我们可以将它放置在边框布局的中间;
  4. 如果我们要求部件保持大小相同,那么,我们就应该采用网格布局。 下面,我们就通过几个实际的例子,来让大家领会和掌握这种设计的思路与方法。

实例说明

我们首先创建一个testCombination.java文件,然后输入以下源程序:

import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testCombination1 extends JApplet {
    public void init() {
        Frame frame1=new Frame("testCombination1");
        frame1.setLayout(new BorderLayout());
        TextArea text1=new TextArea();
        frame1.add(text1,BorderLayout.CENTER);
        JPanel panel1=(JPanel)getContentPane();
        panel1.setLayout(new GridLayout(1,3,10,5));
        panel1.add(new JButton("A"));
        panel1.add(new JButton("B"));
        panel1.add(new JButton("C"));
        frame1.add(panel1,BorderLayout.SOUTH);
        frame1.pack();
        frame1.show();
    }
}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面,如下图所示: 图10-14 程序testCombination.java的输出 正如上图所示,程序的输出与以前不同,各个部件不是显示在Appletviewer程序框中,而是显示在另一个窗口中。 这是怎么回事呢?下面我们就一起来看一下这个程序!

传授新知

在以前的程序中,我们一直都是使用容器JPanel,面板。而我们在这个程序中引进了一个新的容器Frame。使用了这个容器后,就会新创建一个窗口。这也就是为什么程序的输出有这么大的变化的原因。

Frame frame1=new Frame("testCombination");

这条语句,定义了一个Frame容器frame1,然后使用new操作符调用构造器方法,后面带的参数“testCombination”则是这个Frame的标题。
### 一些提示:
其实大家能Frame所体现出来的效果是很熟悉的,它等价于Windows中的窗体。而Frame的标题就是窗体的标题。
2. ```java
frame1.setLayout(new BorderLayout());

与JPanel容器一样,我们可以调用setLayout方法来设置Frame的布局管理器。在这里,我们将Frame容器frame1的布局管理器设置成为边框布局管理器(也就是我们在10.1小节中学习过的布局管理器)。 3. ```java frame1.add(text1,BorderLayout.CENTER);

紧接着,我们调用frame1的add方法,将文本区部件text1添加到frame1容器中来。注意我们设置了它的位置:BorderLayout.CENTER。
这是因为,我们希望这个文本区能够随着窗体的大小变化而变化。所以适合将其放在在中间位置。
4. ```java
panel1.setLayout(new GridLayout(1,3,10,5));

我们又定义了一个JPanel容器panel1,并将其的布局管理器设置为网格布局管理器。并通过指定参数,使得整个panel1被分成1行3列,水平空隙为10的网格。 5. ```java frame1.add(panel1,BorderLayout.SOUTH);

这是组合布局方法最重要的一步,我们将panel1这个容器,加入到了frame1这个容器中去了。并且指定了panel1这个容器在整个frame1中所占的位置:BorderLayout.SOUTH,也就是下边。这样,panel1中包含的三个按钮就会永远(不管窗体大小如何改变)呆在文本区的下边,而且三个按钮的大小会根据窗体大小的改变而改变。
### 一些提示:
这是因为,panel1中的按钮是用网格布局的。
6. ```java
frame1.pack();
frame1.show();

与JPanel不一样,使用Frame容器,不能够直接显示了出来。我们必须调用Frame容器的show方法才能使得Frame显示出来。 而在使用show方法之前,我们还需要使用pack方法将Frame中的内容做一个整合。请记住这里的使用方法。

GridBag布局

实例说明

到现在为止,我们已经学习了边框布局、网格布局以及组合布局,现在大家试一试编写一个程序, 怎么样,挺有难度的吧!完成这个GUI得花很多心思去设计组合,十分讨厌,下面我们就使用一个新的布局管理器GridBagLayout来解决这种难题。 首先,输入以下源程序:

import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testGridBag extends JApplet {
    public void init() {
        JPanel panel1=(JPanel)getContentPane();
        panel1.setLayout(new GridBagLayout());
        GridBagConstraints gbdc=new GridBagConstraints();
        gbdc.fill=GridBagConstraints.BOTH;
        gbdc.weightx=1;
        gbdc.weighty=1;
        panel1.add(new JButton("No.1"),gbdc);
        panel1.add(new JButton("No.2"),gbdc);
        panel1.add(new JButton("No.3"),gbdc);
        gbdc.gridwidth=2;
        gbdc.gridx=0;
        panel1.add(new JButton("No.4"),gbdc);
        gbdc.gridx=2;
        gbdc.gridwidth=1;
        gbdc.gridheight=2;
        panel1.add(new JButton("No.5"),gbdc);
        gbdc.gridx=0;
        gbdc.gridheight=1;
        panel1.add(new JButton("No.6"),gbdc);
        gbdc.gridx=1;
        panel1.add(new JButton("No.7"),gbdc);
        gbdc.gridx=0;
        gbdc.gridwidth=2;
        panel1.add(new JButton("No.8"),gbdc);
        gbdc.gridx=2;
        gbdc.gridwidth=1;
        panel1.add(new JButton("No.9"),gbdc);
    }
}

在这个程序中,我们使用了GridBagLayout轻松地完成了这个界面的设计,允分凸现出它的强大。可以这么说,GridBagLayout是Java语言中最强大的布局管理器。 GridBagLayout,从名字上看,就知道它与GridLayout有一定的渊源,是的,GridBagLayout的确与其十分类似,也是使用网格来进行布局管理的。但与GridLayout(网格布局)不同的是,GridBagLayout不像网格布局一相,需要所有的部件的大小、形状相同。而且还可以将某一个部件放在一个固定的位置上。 下面,我们一起来分析一下testGridBag.java程序。

panel1.setLayout(new GridBagLayout());

在调用setLayout方法时,指定为GridBagLaoyout,使panel1使用GridBag布局管理。
2. ```java
GridBagConstraints gbdc=new GridBagConstraints();

GridBagLayout布局管理器是通过一个GridBagConstraints类来实现神奇的效果的。所以,我们要在使用时先定义一个GridBagConstraints类的对象。在这个程序中,我们定义了一个GridBagConstraints类的对象gbdc。 3. ```java gbdc.fill=GridBagConstraints.BOTH;

由于网格单元可能比该单元中的部件大,如果是这样,部件放置在单元格内会有一些多余空间。在默认情况下,部件不会扩张,也就是不会填充这个多余空间。
GridBagConstraints提供了一个fill属性,我们可以通过设置它的值来起到不同的效果。
- GridBagConstraints.NONE:不扩张,是默认值;
- GridBagConstraints