------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
说实话,不太喜欢java的用户界面,但是我相信学习这章可以掌握一些图形用户界面编程的经验,对于以后的安卓UI的开发应该是有帮助的,
而且老在控制台打印东西也很不爽,是吧,所以分享一下自己的GUI经验。
java.awt这个包含用于创建用户界面和绘制图形图像的所有类。
由上图可以看出,GUI中的组件可分为:

一 来写一个简单的窗口
要写窗口就要用到 Frame 这个类,我们来认识一下这个类
Frame
是带有标题和边框的顶层窗口。
窗体的大小包括为边框指定的所有区域。边框区域的尺寸可以使用 getInsets
方法获得,但是,由于这些尺寸与平台相关,因此在通过调用 pack
或 show
将窗体设置为可显示之前,将无法获得有效的 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()
- 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布局时,向容器中加入的组件数目应与容器划分出来的单元格总数相等,但假如出现两者数目不等的情况,程序也不会出错,而是保证行数为设置值,列数则通过指定的行数和布局中的组件总数来进行调整。