黑马程序员第十季——GUI

本文介绍 Java 中 GUI 的基础知识及应用案例,包括 Frame 类的使用、不同布局管理器(如 FlowLayout、BorderLayout 和 GridLayout)的特点及实现方法,通过实际例子展示了聊天程序的界面设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

说实话,不太喜欢java的用户界面,但是我相信学习这章可以掌握一些图形用户界面编程的经验,对于以后的安卓UI的开发应该是有帮助的,

而且老在控制台打印东西也很不爽,是吧,所以分享一下自己的GUI经验。

java.awt这个包含用于创建用户界面和绘制图形图像的所有类。 


由上图可以看出,GUI中的组件可分为:

 

一  来写一个简单的窗口

要写窗口就要用到 Frame 这个类,我们来认识一下这个类

Frame 是带有标题和边框的顶层窗口。

窗体的大小包括为边框指定的所有区域。边框区域的尺寸可以使用 getInsets 方法获得,但是,由于这些尺寸与平台相关,因此在通过调用 packshow 将窗体设置为可显示之前,将无法获得有效的 insets 值。由于窗体的总大小包括了边框区,因此边框实际上遮掩了窗体的部分区域,并将可用于在矩形中呈现和/或显示子部件的区域限制在一个矩形内,该矩形左上角的位置为 (insets.left, insets.top),宽度为 width - (insets.left + insets.right),长度为 height - (insets.top + insets.bottom)

窗体的默认布局为 BorderLayout。 

构造方法摘要 
Frame() 
          构造一个最初不可见的 Frame 新实例()。 
Frame(GraphicsConfiguration gc) 
          使用指定的 GraphicsConfiguration 构造一个最初不可见的新 Frame。 
Frame(String title) 
          构造一个新的、最初不可见的、具有指定标题的 Frame 对象。 
Frame(String title, GraphicsConfiguration gc) 
          构造一个新的、初始不可见的、具有指定标题和 GraphicsConfiguration 的 Frame 对象。 
下来我们就写一个空白窗口:

public class Test {

	public static void main(String[] args) {
		new MyFrame("一个空白窗口");		

	}

}
public class MyFrame extends JFrame {
	
	public MyFrame(String s){
		this.setTitle(s);
		this.setBounds(200, 200, 590, 520);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setVisible(true);
	}
	
}

对于AWT这个包中的一些其他控件,我建议大家去查API文档,这里我就不详细介绍了,重点我来谈一下布局,我自己写了一个小聊天程序,

大家来看看。



还是先上代码:

public class MyFrame extends JFrame implements ActionListener {
	static String words;
	BufferedWriter bw;

	// 1.定义组件

	JToolBar tool_one, tool_two;
	JPanel mb1, mb2, mb3, mb4;
	static JTextArea read_text, edit_text;
	JScrollPane scroll_read, scroll_edit;
	JButton save, delete, face, message, send, close;
	JLabel backGround;

	public MyFrame(String s) {
		try {
			bw = new BufferedWriter(new FileWriter("d:/dialogue.txt", true));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// 2.设置布局,如果不设置布局,默认为BorderLayout
		this.setLayout(new BorderLayout());
		// 3.创建组件
		mb1 = new JPanel();
		mb2 = new JPanel();
		mb3 = new JPanel();
		mb4 = new JPanel();
		// 工具条
		tool_one = new JToolBar();
		save = new JButton(new ImageIcon("image/save.jpg"));
		save.setToolTipText("保存");
		delete = new JButton(new ImageIcon("image/delete.jpg"));
		delete.setToolTipText("删除");
		tool_two = new JToolBar();
		face = new JButton(new ImageIcon("image/face.jpg"));
		face.setToolTipText("发送表情");
		message = new JButton(new ImageIcon("image/message.jpg"));
		message.setToolTipText("消息记录");
		// 文本域
		read_text = new JTextArea();
		read_text.setLineWrap(true);
		read_text.setEditable(false);
		edit_text = new JTextArea();
		edit_text.setLineWrap(true);
		// 在文本域中的滚动条
		scroll_read = new JScrollPane(read_text);
		scroll_edit = new JScrollPane(edit_text);
		// 背景图片
		backGround = new JLabel(new ImageIcon("image/background.jpg"));
		// 发送,关闭按钮
		send = new JButton(new ImageIcon("image/send.jpg"));
		close = new JButton(new ImageIcon("image/close.jpg"));

		// 4.添加组件

		tool_one.add(save);
		tool_one.add(delete);
		tool_two.add(face);
		tool_two.add(message);
		this.add(tool_one, BorderLayout.NORTH);
		mb3.setLayout(new GridLayout(2, 1));
		mb1.setLayout(new BorderLayout());
		mb1.add(backGround, BorderLayout.EAST);
		mb1.add(scroll_read, BorderLayout.CENTER);
		// 面板4是发送,关闭按钮
		mb4.setLayout(new FlowLayout(FlowLayout.RIGHT));
		mb4.add(close);
		mb4.add(send);

		// 这里一定要改变面板布局,因为面板的默认布局是FLowLayout
		mb2.setLayout(new BorderLayout());
		mb2.add(tool_two, BorderLayout.NORTH);
		mb2.add(scroll_edit, BorderLayout.CENTER);
		mb2.add(mb4, BorderLayout.SOUTH);
		mb3.add(mb1);
		mb3.add(mb2);

		this.add(mb3, BorderLayout.CENTER);
		this.add(backGround, BorderLayout.EAST);
		// 5.设置组件监听
		send.addActionListener(this);

		// 6.设置窗体属性
		this.setTitle(s);
		this.setBounds(200, 200, 590, 520);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setVisible(true);

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		words = edit_text.getText();
		Send.flag = true;
		

		try {
			bw.append("我说: " + words);
			bw.newLine();
			// bw.write("\r\n");
			bw.flush();

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		System.out.println("words" + words);

		edit_text.setText(null);

	}

}

布局管理器

  • 容器对象.setLayout(布局管理器对象) 
  • 布局管理器  容器对象.getLayout()
  1. FlowLayout:流式布局,是Panel(及其子类) 默认布局管理器
    • 布局效果:组件在容器中按照加入次序逐行定位,行内从左到右,一行排满后换行。组件按原始大小进行显示构造方法
      • public FlowLayout():默认居中对齐
      • public FlowLayout(int align):显示设定组件对其方式
      • public FlowLayout(int align,int hgap,int vgap):设置水平和垂直间距
        • FlowLayout.LEFT左对齐
        • FlowLayout.RIGHT 右对齐
        • FlowLayout.CENTER居中
import java.awt.*;
public class FlowLayoutDemo{
  public static void main(String[] args) {
    Frame f = new Frame("流动布局");
    Button b1 = new Button("按钮1");
    Button b2 = new Button("按钮2");
    Button b3 = new Button("按钮3");
    
    f.setLayout(new FlowLayout());
    f.add(b1);
    f.add(b2);
    f.add(b3);
    
    f.setSize(200,300);
    f.setVisible(true);
  }
}



2.BorderLayout:边界布局,是Window及其子类类型容器的默认布局管理器。
  • 布局效果:将整个容器范围划分成East、West、South、North、Center五个区域,组件只能被添加到指定的区域。
  • 在使用边界布局的容器中,组件的尺寸也被布局管理器强行控制,即与其所在区域的尺寸相同。 
  • 每个区只能加入一个组件,如加入多个,先前的组件会被抛弃
  • 当容器的尺寸发生变化时,其中各组件相对位置不变,尺寸随所在区域进行缩放调整; 
    调整原则:北、南两个区域只能在水平方向缩放(宽度可调),东、西两个区域只能在垂直方向缩放(高度可调),中部区域都可缩放。 
  • 构造方法
    • public BorderLayout()
    • public BorderLayout(int hgap,int vgap) : 水平和垂直间距
    • 5个区域:
      • BorderLayout.EAST
      • BorderLayout.WEST 
      • BorderLayout.SOUTH
      • BorderLayout.NOUTH 
      • BorderLayout.CENTER 
import java.awt.*;

public class BorderLayoutDemo extends Frame {
  Button bNorth,bSouth,bWest,bEast,bCenter;
  public BorderLayoutDemo(){
    super("边框布局");
    bNorth = new Button("按钮1");
    bSouth = new Button("按钮2");
    bWest = new Button("按钮3");
    bEast = new Button("按钮4");
    bCenter = new Button("按钮5");
    add(bNorth,"North");
    add(bSouth,"South");
    add(bWest,"West");
    add(bEast,"East");
    add(bCenter,"Center");
    setBounds(200,200,300,300);
    setVisible(true);
  }
  public static void main(String[] args){
    new BorderLayoutDemo();
  }
}


GridLayout:网格布局

  • 布局效果:将容器区域划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,按组件加入顺序先从左到右填满一行后换行,行间从上到下。 
  • 行数为设置值,列数则通过指定的行数和布局中的组件总数来进行调整
  • 正常情况下使用GridLayout布局时,向容器中加入的组件数目应与容器划分出来的单元格总数相等,但假如出现两者数目不等的情况,程序也不会出错,而是保证行数为设置值,列数则通过指定的行数和布局中的组件总数来进行调整。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值