目录
4.BorderLayout(可以将容器分为东西南北中五个区域的布局)
前言
学习图形界面的设计,利用MFC应用程序(或Java swing 或QT框架)创建基于对话框的应用程序,能通过设计的控件输入并实现混合运算的算术表达式,要求表达式在编辑框中显示,能将运算结果,输出在编辑框内显示;并保存历史的表达式运算记录。也能够实现算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确。
一、Java Swing 介绍
Swing 是一个为Java设计的GUI工具包。
Swing是JAVA基础类的一部分。
Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。
Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
二、学习内容
1.panel(容器)
代码如下:
public class PanelDemo {
public static void main(String[] args) {
Frame frame = new Frame("panel");//创建window窗口
Panel panel = new Panel();//创建panel容器,不能独立存在,依附于window
panel.add(new TextField("测试文本"));//添加文本到panel
panel.add(new Button("测试按钮"));//添加按钮到panel
frame.add(panel);//添加panel到window
frame.setBounds(100,100,500,300);//x,y,长,宽
frame.setVisible(true);//窗口可视
}
}
运行结果:
在运行时会出现乱码,是因为编码(idea默认utf-8)和解码(电脑默认gbk)不同,需要在VM options 里添加-Dfile.encoding=gbk
2.Scrollpane(带滚动条的容器)
代码如下:
package com.one.container;
import java.awt.*;
public class ScrollPaneDemo {
public static void main(String[] args) {
Frame frame = new Frame("ScrollPane");
ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);//创建带滚动条容器对象,固定带有滚动条
Panel panel = new Panel();
panel.add(new TextField("测试文本"));
panel.add(new Button("测试按钮"));
sp.add(panel);//因为ScrollPane默认布局管理器为BorderLayout,在同一区域添加多个组件会覆盖上一个组件;而panel默认的布局管理器为FlowLayout,可以将组件按照从左到右布局,所以这里先将文本和按钮放在panel容器里,再将panel放入ScrollPane容器里,避免直接在ScrollPane里添加组件导致覆盖。
frame.add(sp);
frame.setBounds(100,100,500,300);
frame.setVisible(true);
}
}
运行结果:
3. FlowLayout(流水布局)
代码如下:
package com.one.layout;
import java.awt.*;
public class FlowLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("测试FlowLayout");
frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));
//frame.setLayout(new FlowLayout(FlowLayout.CENTER,20,20));
//frame.setLayout(new FlowLayout(FlowLayout.RIGHT,20,20));
for (int i = 1;i<=100;i++){
frame.add(new Button("按钮"+i));
}
frame.pack();
frame.setVisible(true);
}
}
运行结果:
4.BorderLayout(可以将容器分为东西南北中五个区域的布局)
代码如下:
package com.one.layout;
import java.awt.*;
public class BorderLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("测试BorderLayout");
frame.setLayout(new BorderLayout(30,10));
frame.add(new Button("北侧按钮"),BorderLayout.NORTH);
frame.add(new Button("南侧按钮"),BorderLayout.SOUTH);
frame.add(new Button("东侧按钮"),BorderLayout.EAST);
frame.add(new Button("西侧按钮"),BorderLayout.WEST);
frame.add(new Button("中间按钮"),BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
}
运行结果:
5.GridLayout(网格布局,计算器界面设计)
代码如下(制作一个计算器界面):
package com.one.layout;
import java.awt.*;
public class GridLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("计算器");
Panel panel = new Panel();
panel.add(new TextField(30));
frame.add(panel,BorderLayout.NORTH);//上部分
Panel panel1 = new Panel();//下部分
panel1.setLayout(new GridLayout(5,4,5,5));//5行4列,水平和垂直间隔5
panel1.add(new Button("C"));
panel1.add(new Button("("));
panel1.add(new Button(")"));
panel1.add(new Button("÷"));
panel1.add(new Button("7"));
panel1.add(new Button("8"));
panel1.add(new Button("9"));
panel1.add(new Button("×"));
panel1.add(new Button("4"));
panel1.add(new Button("5"));
panel1.add(new Button("6"));
panel1.add(new Button("-"));
panel1.add(new Button("1"));
panel1.add(new Button("2"));
panel1.add(new Button("3"));
panel1.add(new Button("+"));
panel1.add(new Button("+/-"));
panel1.add(new Button("0"));
panel1.add(new Button("."));
panel1.add(new Button("="));
frame.add(panel1);
frame.pack();
frame.setVisible(true);
}
}
运行结果:
6.CardLayout(卡片布局)
代码如下:
package com.one.layout;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CardLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("Card");
Panel panel = new Panel();
CardLayout cardLayout = new CardLayout();
panel.setLayout(cardLayout);
String[] names = {"第一张","第二张","第三张","第四张","第五张"};//往panel中存多个组件
for (int i = 0; i < names.length; i++) {
panel.add(names[i],new Button(names[i]));
}
frame.add(panel);
Panel panel1 = new Panel();//panel1存储多个按钮
Button b1 = new Button("上一张");
Button b2 = new Button("下一张");
Button b3 = new Button("第一张");
Button b4 = new Button("最后一张");
Button b5 = new Button("第三张");
//事件监听器,监听按钮的点击动作
ActionListener actionListener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();//这个字符串是按钮上的文字
switch (actionCommand){
case "上一张":
cardLayout.previous(panel);
break;
case "下一张":
cardLayout.next(panel);
break;
case "第一张":
cardLayout.first(panel);
break;
case "最后一张":
cardLayout.last(panel);
break;
case "第三张":
cardLayout.show(panel,"第三张");
break;
}
}
};
//把时间监听器和多个按钮绑定
b1.addActionListener(actionListener);
b2.addActionListener(actionListener);
b3.addActionListener(actionListener);
b4.addActionListener(actionListener);
b5.addActionListener(actionListener);
//把按钮放到panel1
panel1.add(b1);
panel1.add(b2);
panel1.add(b3);
panel1.add(b4);
panel1.add(b5);
//把按钮放到南部
frame.add(panel1,BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
}
实验结果:
7.BoxLayout(盒子布局)
代码如下:
package com.one.layout;
import javax.swing.*;
import java.awt.*;
public class BoxLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("测试Box");
Box hbox = Box.createHorizontalBox();//创建水平布局box对象
hbox.add(new Button("水平按钮1"));
hbox.add(Box.createHorizontalGlue());//添加水平空格
hbox.add(new Button("水平按钮2"));
hbox.add(Box.createHorizontalStrut(30));//添加宽度固定为30的水平空格
hbox.add(new Button("水平按钮3"));
Box vbox = Box.createVerticalBox();//添加垂直布局的box对象
vbox.add(new Button("垂直按钮1"));
vbox.add(Box.createVerticalGlue());//添加垂直空格
vbox.add(new Button("垂直按钮2"));
vbox.add(Box.createVerticalStrut(30));//添加高度固定的垂直空格
vbox.add(new Button("垂直按钮3"));
frame.add(hbox,BorderLayout.NORTH);//将水平布局的box容器放在window的北边
frame.add(vbox);//垂直布局的box容器默认放在中间
frame.pack();
frame.setVisible(true);
}
}
运行结果: