Java图形化界面设计 mdash  mdash GridBagConstraints

Java图形化界面设计是Java语言的一个重要应用领域,其中GridBagConstraints是用于GridLayout布局的一个控制器,可以在网格布局中对组件进行精细调整。在本文中,我们将重点介绍GridBagConstraints的使用方法,提供案例说明,并向您展示如何使用它来创建复杂的GUI界面。

一、GridBagConstraints的概述

GridBagConstraints是Java中实现网格布局的一个控制器,可用于对组件进行各种精细调整。它提供了一个灵活的接口,使开发人员可以在网格布局中自由地控制组件的位置、大小、对齐方式和填充方式等属性。GridBagConstraints是一个包含多个字段的类,每个字段对应一个可调整的属性。

GridBagConstraints提供的控制属性包括:

1、 gridx:组件在网格布局中的横向网格位置;

2、 gridy:组件在网格布局中的纵向网格位置;

3、 gridwidth:组件所占据的横向网格数;

4、 gridheight:组件所占据的纵向网格数;

5、 weightx:组件在横向方向上所占据的空间比例;

6、 weighty:组件在纵向方向上所占据的空间比例;

7、 anchor:组件在所在格的空间中的对齐方式;

8、 fill:当组件不能充满网格时,对其进行填充的方式;

9、 insets:组件与所在格之间的外部填充大小。

二、GridBagConstraints使用介绍

在使用GridBagConstraints时,我们需要设置每个组件的约束条件,并将这些条件传递给网格布局管理器。下面的代码是一个示例,它展示了如何使用GridBagConstraints创建一个简单的网格布局:

```java

import javax.swing.*;

import java.awt.*;

public class Demo extends JFrame{

private JButton btn1,btn2,btn3,btn4,btn5,btn6;

private JPanel panel;

public Demo(){

super("GridBagLayout");

panel = new JPanel();

panel.setLayout(new GridBagLayout());

btn1 = new JButton("1");

btn2 = new JButton("2");

btn3 = new JButton("3");

btn4 = new JButton("4");

btn5 = new JButton("5");

btn6 = new JButton("6");

GridBagConstraints gbc = new GridBagConstraints();

gbc.fill = GridBagConstraints.BOTH;

gbc.weightx = 1;

gbc.weighty = 1;

gbc.gridx = 0;

gbc.gridy = 0;

gbc.gridwidth = 3;

gbc.gridheight = 1;

panel.add(btn1,gbc);

gbc.gridwidth = 1;

gbc.gridheight = 1;

gbc.gridx = 0;

gbc.gridy = 1;

panel.add(btn2,gbc);

gbc.gridx = 1;

gbc.gridy = 1;

panel.add(btn3,gbc);

gbc.gridx = 2;

gbc.gridy = 1;

panel.add(btn4,gbc);

gbc.gridx = 0;

gbc.gridy = 2;

gbc.gridwidth = 2;

panel.add(btn5,gbc);

gbc.gridx = 2;

gbc.gridy = 2;

gbc.gridwidth = 1;

panel.add(btn6,gbc);

add(panel);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(300,200);

setLocationRelativeTo(null);

setVisible(true);

}

public static void main(String[] args){

new Demo();

}

}

```

以上程序中,我们创建了一个名为“Demo”的类,并在其中定义了一些按钮对象和一个JPanel对象。该类继承自JFrame类,因此可以通过继承的方法直接设置整个窗体。在主方法中,我们创建了一个Demo对象,该对象动态地生成了一个简单的网格布局GUI。

通过以上代码的实现,我们可以看到,在使用GridBagConstraints时,需要遵循以下步骤:

1、创建一个Panel或其他容器来容纳组件;

2、使用GridBagLayout作为布局管理器;

3、为每个组件设置一个GridBagConstraints对象;

4、使用GridBagConstraints对象在Panel(container)中添加组件;

5、制定窗口的特定大小。

三、GridBagConstraints案例说明

了解了GridBagConstraints的基本概念和使用方式后,我们可以将其应用到实际项目中。下面,我们将设计一个美食点评系统(Food Review System)的GUI,用于展示各种美食店和美食菜肴的详细信息。

在GUI设计中,我们会使用以下组件:

1、JFrame:用于创建主窗口;

2、JLabel:用于展示标题、说明和其他文本;

3、JTextField:用于输入搜索关键字;

4、JButton:用于触发搜索操作;

5、JTable:用于展示美食店和美食菜单的信息;

6、JScrollPane:用于支持滚动视图的面板。

为了更好的展示GridBagConstraints的具体使用,我们将结合代码的注释和类说明,“逐个解释”这个案例。

1、关键字输入和搜索操作

```java

import javax.swing.*;

import java.awt.*;

public class FoodReviewSystem extends JFrame{

private JPanel topPanel, bottomPanel;

private JLabel titleLabel, keywordLabel;

private JTextField keywordField;

private JButton searchBtn;

public FoodReviewSystem(){

super("美食点评系统");

//创建JPanel面板,作为最上层容器

topPanel = new JPanel();

topPanel.setLayout(new GridBagLayout());

//添加标题控件,并指定显示约束条件

titleLabel = new JLabel("欢迎使用美食点评系统");

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridx = 0;

gbc.gridy = 0;

gbc.gridwidth = 3;

gbc.gridheight = 1;

gbc.fill = GridBagConstraints.BOTH;

gbc.anchor = GridBagConstraints.CENTER;

gbc.insets = new Insets(10, 10, 10, 10);

topPanel.add(titleLabel, gbc);

//添加关键字提示控件并指定显示约束条件

keywordLabel = new JLabel("请输入关键字:");

gbc = new GridBagConstraints();

gbc.gridx = 0;

gbc.gridy = 1;

gbc.gridwidth = 1;

gbc.gridheight = 1;

gbc.anchor = GridBagConstraints.WEST;

gbc.insets = new Insets(0, 10, 0, 5);

topPanel.add(keywordLabel, gbc);

//添加输入框控件并指定显示约束条件

keywordField = new JTextField();

gbc = new GridBagConstraints();

gbc.gridx = 1;

gbc.gridy = 1;

gbc.gridwidth = 1;

gbc.gridheight = 1;

gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.insets = new Insets(0, 0, 0, 5);

topPanel.add(keywordField, gbc);

//添加搜索按钮控件并指定显示约束条件

searchBtn = new JButton("搜索");

gbc = new GridBagConstraints();

gbc.gridx = 2;

gbc.gridy = 1;

gbc.gridwidth = 1;

gbc.gridheight = 1;

gbc.fill = GridBagConstraints.NONE;

gbc.anchor = GridBagConstraints.EAST;

gbc.insets = new Insets(0, 0, 0, 10);

topPanel.add(searchBtn, gbc);

//在JFrame中添加最上级面板

add(topPanel, BorderLayout.NORTH);

//设置窗口大小、位置以及是否可见

setSize(700, 400);

setLocationRelativeTo(null);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

}

public static void main(String[] args){

new FoodReviewSystem();

}

}

```

以上代码定义了一个程序类“FoodReviewSystem”,其中,我们在主构造函数中创建了一个名为“topPanel”的JPanel面板,并将其作为整个窗口的最上级容器。在topPanel面板中,我们添加了一个JLabel控件(显示程序标题),以及一个JTextField控件和一个JButton控件,用于输入关键字并触发搜索操作。该面板使用GridBagLayout管理器,并使用GridBagConstraints对象来指定控件的位置和大小。

2、美食店和美食菜单展示

下面的代码展示了如何使用JTable对象和JScrollPane对象来展示美食店和美食菜单的详细信息。为了更好地控制JTable对象的显示样式,我们将自定义一个名为“FoodTable”的Table类,并重写其中的getCellRenderer()方法。该方法返回一个JComponent对象,用于定制表格单元格的显示方式。

```java

import javax.swing.*;

import javax.swing.table.DefaultTableCellRenderer;

import java.awt.*;

import java.util.Vector;

public class FoodReviewSystem2 extends JFrame{

private JPanel topPanel, bottomPanel;

private JLabel titleLabel, keywordLabel;

private JTextField keywordField;

private JButton searchBtn;

private FoodTable foodTable;

private JScrollPane scrollPane;

public FoodReviewSystem2(){

super("美食点评系统");

//创建最上级面板,并指定布局管理器和显示约束条件

topPanel = new JPanel();

topPanel.setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridx = 0;

gbc.gridy = 0;

gbc.gridwidth = 3;

gbc.gridheight = 1;

gbc.fill = GridBagConstraints.BOTH;

gbc.anchor = GridBagConstraints.CENTER;

gbc.insets = new Insets(10, 10, 10, 10);

//添加标题控件

titleLabel = new JLabel("欢迎使用美食点评系统");

topPanel.add(titleLabel, gbc);

//添加关键字输入框控件

keywordLabel = new JLabel("请输入关键字:");

gbc = new GridBagConstraints();

gbc.gridx = 0;

gbc.gridy = 1;

gbc.gridwidth = 1;

gbc.gridheight = 1;

gbc.anchor = GridBagConstraints.WEST;

gbc.insets = new Insets(0, 10, 0, 5);

topPanel.add(keywordLabel, gbc);

keywordField = new JTextField();

gbc = new GridBagConstraints();

gbc.gridx = 1;

gbc.gridy = 1;

gbc.gridwidth = 1;

gbc.gridheight = 1;

gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.insets = new Insets(0, 0, 0, 5);

topPanel.add(keywordField, gbc);

searchBtn = new JButton("搜索");

gbc = new GridBagConstraints();

gbc.gridx = 2;

gbc.gridy = 1;

gbc.gridwidth = 1;

gbc.gridheight = 1;

gbc.fill = GridBagConstraints.NONE;

gbc.anchor = GridBagConstraints.EAST;

gbc.insets = new Insets(0, 0, 0, 10);

topPanel.add(searchBtn, gbc);

//创建美食店和美食菜单的JTable对象

foodTable = new FoodTable();

scrollPane = new JScrollPane(foodTable);

bottomPanel = new JPanel();

bottomPanel.setLayout(new BorderLayout());

bottomPanel.add(scrollPane, BorderLayout.CENTER);

//在JFrame中添加两个面板

add(topPanel, BorderLayout.NORTH);

add(bottomPanel, BorderLayout.CENTER);

//设置窗口大小、位置以及是否可见

setSize(700, 400);

setLocationRelativeTo(null);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

}

public static void main(String[] args){

new FoodReviewSystem2();

}

}

//自定义Table类

class FoodTable extends JTable{

public FoodTable(){

super(new FoodTableModel());

//设置表格样式

setSelectionBackground(new Color(238, 238, 238));

setSelectionForeground(Color.BLUE);

TableColumn column = getColumnModel().getColumn(0);

column.setPreferredWidth(50);

column = getColumnModel().getColumn(1);

column.setPreferredWidth(200);

column = getColumnModel().getColumn(2);

column.setPreferredWidth(200);

column = getColumnModel().getColumn(3);

column.setPreferredWidth(150);

column = getColumnModel().getColumn(4);

column.setCellRenderer(new StarTableCellRenderer());

}

//自定义单元格显示

private class StarTableCellRenderer extends DefaultTableCellRenderer{

@Override

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){

JLabel label = (JLabel)super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);

int starValue = Integer.parseInt(value.toString());

StringBuilder sb = new StringBuilder();

for(int i = 0; i < starValue; i++){

sb.append("⭐");

}

label.setText(sb.toString());

return label;

}

}

}

//自定义TableModel类

class FoodTableModel extends javax.swing.table.AbstractTableModel{

private String[] columnNames = new String[]{"序号", "餐厅名称", "菜品名称", "评分", "用户评价"};

private Vector rowData = new Vector();

public FoodTableModel(){

Vector v1 = new Vector();

v1.add("1");

v1.add("浪漫主题餐厅");

v1.add("异国风味牛排");

v1.add("4");

v1.add("3");

rowData.add(v1);

Vector v2 = new Vector();

v2.add("2");

v2.add("小吃街");

v2.add("糖油粉条");

v2.add("5");

v2.add("5");

rowData.add(v2);

}

public String getColumnName(int column){

return columnNames[column];

}

public int getRowCount(){

return rowData.size();

}

public int getColumnCount(){

return columnNames.length;

}

public Object getValueAt(int row, int column){

return ((Vector)rowData.get(row)).get(column);

}

}

```

以上代码定义了一个程序类“FoodReviewSystem2”,该类主要特点是在上一个案例的基础上引入了一个名为“FoodTable”的自定义表格类。该类使用了一个自定义的TableModel类“FoodTableModel”,并使用了一个自定义的TableCellRenderer类“StarTableCellRenderer”来实现单元格的定制显示。

在上面的代码中,“FoodTable”类的构造函数重写了父类的构造函数,以便实现对表格的样式和显示方式进行设置。其中,“setSelectionBackground(Color)”和“setSelectionForeground(Color)”方法分别用于设置表格选中区域的背景色和前景色,而“setPreferredWidth(int)”方法用于设置表格列的宽度。在“FoodTableModel”类中,我们定义了一个包含美食店和美食菜品信息的Vector对象,用于初始化表格数据。

最终,我们得到了一个美食点评系统,可以实现关键字搜索和美食信息的详细展示,GUI布局效果如下:

![FoodReviewSystem GUI layout](https://img-blog.csdn.net/20180820223455794)

四、总结

GridBagConstraints是Java中实现网格布局的一个控制器,在GUI设计过程中起着重要的作用。它可以帮助我们实现对组件的位置、大小、对齐方式和填充方式等属性的细粒度控制,是创建复杂GUI界面的关键之一。在本文中,我们总结了GridBagConstraints的基本概念和使用方法,并提供了一个实际项目的案例说明。希望本文可以对您在Java GUI设计方面的学习和应用有所帮助! 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(70) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部