目录
1、简介
Gui的核心技术: Swing AWT
缺点:
1、界面不美观
2、需要jre环境
2、AWT
2.1、AWT介绍
1、包含了很多类和接口
2、元素:窗口,按钮,文本框
2.2、弹窗Frame
Frame frame = new Frame("title");
//设置可见性
frame.setVisible(true);
//设置窗口大小 width,height
frame.setSize(300, 300);
//设置背景颜色
frame.setBackground(Color.BLACK);
//弹出的初始位置 x,y
frame.setLocation(200,200);
//设置弹出位置和窗口大小 x,y,width,height
frame.setBounds(300,300,500,500);
//设置大小固定
frame.setResizable(false);
//设置背景颜色
frame.setBackground(new Color(40,161,35));
2.3、面板Panel
Frame frame = new Frame("Test");
Panel panel = new Panel();
//x,y,width,height
panel.setBounds(50,50,400,400);
//设置背景颜色
panel.setBackground(new Color(193,14,60));
//添加面板到弹窗
frame.add(panel);
2.4、布局管理器
流式布局
Frame frame = new Frame("FlowLayout");
//设置为流式布局
//RIGHT是右对齐
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
东西南北中
Frame frame = new Frame("Text Border Layout");
//创建button
Button button1 = new Button("East");
Button button2 = new Button("West");
Button button3 = new Button("South");
Button button4 = new Button("North");
Button button5 = new Button("Center");
//在添加button时设置布局位置
frame.add(button1,BorderLayout.EAST);
frame.add(button2,BorderLayout.WEST);
frame.add(button3,BorderLayout.SOUTH);
frame.add(button4,BorderLayout.NORTH);
frame.add(button5,BorderLayout.CENTER);
表格布局
Frame frame = new Frame();
//设置为3行2列
frame.setLayout(new GridLayout(3, 2));
//pack可以使窗口自动调整到合适的大小
//根据组件的首选大小自动调整窗口的大小,使其刚好容纳所有的组件
frame.pack();
综合代码实现
实现效果
public static void main(String[] args) {
Frame frame = new Frame();
frame.setLayout(new GridLayout(2,1));
frame.setVisible(true);
frame.setSize(400,300);
frame.setLocation(300,400);
frame.setBackground(Color.BLACK);
Panel p1 = new Panel(new BorderLayout());
Panel p2 = new Panel(new GridLayout(2,1));
Panel p3 = new Panel(new BorderLayout());
Panel p4 = new Panel(new GridLayout(2,2));
p1.add(new Button("East-1"),BorderLayout.EAST);
p1.add(new Button("West-1"),BorderLayout.WEST);
p2.add(new Button("p2-btn-1"));
p2.add(new Button("p2-btn-2"));
p1.add(p2,BorderLayout.CENTER);
p3.add(new Button("East-2"),BorderLayout.EAST);
p3.add(new Button("West-2"),BorderLayout.WEST);
for (int i = 0; i < 4; i++) {
p4.add(new Button("p4-btn-"+i));
}
p3.add(p4);
frame.add(p1);
frame.add(p3);
}
总结
-
Frame是一个顶级窗口
-
Panel无法单独显示,必须添加到某个容器中
-
布局管理器
-
流式布局
-
东西南北中
-
表格布局
-
2.5、事件监听
//按下按钮,触发一些事件
Frame frame = new Frame();
Button button = new Button();
//给button添加监听器
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("test");
}
});
//给窗口添加关闭事件
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.add(button,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
多个按钮共享一个事件
public class TestActionTwo {
public static void main(String[] args) {
//两个按钮,实现同一个监听
Frame frame = new Frame("Test");
Button button1 = new Button("start");
Button button2 = new Button("stop");
//可以显示定义触发会返回的命令,如果不显示定义,则会走默认的值
//此处button1的getActionCommand方法返回"start"
//button2的getActionCommand方法返回"button2-stop"
//可以多个按钮只写一个监听器
button2.setActionCommand("button2-stop");
MyMonitor monitor = new MyMonitor();
button1.addActionListener(monitor);
button2.addActionListener(monitor);
frame.add(button1,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
}
class MyMonitor implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
}
2.6、输入框TextField监听
//文本框
TextField textField = new TextField();
//给文本框添加监听器
//按下enter 就会触发这个输入框的事件
textField .addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获得一些资源 返回的一个对象
TextField field = (TextField) e.getSource();
//获取输入框中的文本,并输出
System.out.println(field.getText());
//回车之后清空输入框中的文本
field.setText("");
}
});
//设置替换编码
//用户输入后不会显示输入内容,用 * 代替
textField .setEchoChar('*');
2.7、简易计算器,组合+内部类
面向过程
//计算器类
class Calculator extends Frame{
public Calculator(){
//3个文本框
TextField num1 = new TextField(10);//字符数
TextField num2 = new TextField(10);//字符数
TextField num3 = new TextField(20);//字符数
//1个按钮
Button button = new Button("=");
button.addActionListener(new MyCalculatorListener(num1,num2,num3));
//1个标签
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
}
//监听器类
class MyCalculatorListener implements ActionListener {
private TextField num1,num2,num3;
//获取3个变量
public MyCalculatorListener(TextField num1,TextField num2,TextField num3){
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
//2.运算后放到第三个框
num3.setText(String.valueOf(n1+n2));
//3.清除前两个框
num1.setText("");
num2.setText("");
}
}
面向对象
//计算器类
class Calculator extends Frame{
//3个文本框
TextField num1;
TextField num2;
TextField num3;
public void loadFrame(){//1个按钮
num1 = new TextField(10);//字符数
num2 = new TextField(10);//字符数
num3 = new TextField(20);//字符数
Button button = new Button("=");
button.addActionListener(new MyCalculatorListener(this));
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);}
}
//监听器类
class MyCalculatorListener implements ActionListener {
//获取计算器这个对象,在一个类中组合另外一个类
Calculator calculator;
//获取3个变量
public MyCalculatorListener(Calculator calculator){
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数
int n1 = Integer.parseInt(calculator.num1.getText());
int n2 = Integer.parseInt(calculator.num2.getText());
//2.运算后放到第三个框
calculator.num3.setText(String.valueOf(n1+n2));
//3.清除前两个框
calculator.num1.setText("");
calculator.num2.setText("");
}
}
内部类
//计算器类
class Calculator extends Frame{
//3个文本框
TextField num1;
TextField num2;
TextField num3;
public void loadFrame(){//1个按钮
num1 = new TextField(10);//字符数
num2 = new TextField(10);//字符数
num3 = new TextField(20);//字符数
Button button = new Button("=");
button.addActionListener(new MyCalculatorListener());
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
//监听器类
//内部类最大的好处,就是可以畅通无阻的访问外部的属性和方法
private class MyCalculatorListener implements ActionListener {
//获取3个变量
public MyCalculatorListener(){
}
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText(String.valueOf(n1+n2));
num1.setText("");
num2.setText("");
}
}
}
2.8、画笔
class MyPaint extends Frame {
//画笔
@Override
public void paint(Graphics g) {
//设置画笔颜色
g.setColor(Color.red);
//画空心圆 x,y,width,height
g.drawOval(100,100,100,100);
//画实心圆 x,y,width,height
g.fillOval(100,100,100,100);
//
super.paint(g);
//设置画笔颜色
g.setColor(Color.green);
//画长方形 x,y,width,height
g.fillRect(150,200,200, 200);
//画笔用完还原到最初的颜色
g.setColor(Color.BLACK);
}
}
2.9、鼠标监听
class MyFrame extends Frame {
ArrayList points;
//利用构造器进行初始化
public MyFrame(){
setBounds(200,200,400,300);
setVisible(true);
//存鼠标点击的点
points = new ArrayList();
//给鼠标添加监听器
//MouseAdapter是适配器模式
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
MyFrame my = (MyFrame) e.getSource();
my.addPaint(new Point(e.getX(),e.getY()));
//每点击一次需要重新画一遍
my.repaint();
}
});
}
@Override
public void paint(Graphics g) {
//使用迭代器迭代 把每一个点都画一遍
Iterator iterator = points.iterator();
while(iterator.hasNext()){
Point point = (Point)iterator.next();
g.setColor(Color.blue);
//利用画实心圆来画点
g.fillOval(point.x,point.y,10,10);
}
}
//添加一个点到界面上(集合中)
public void addPaint(Point point){
points.add(point);
}
}
2.10、窗口监听
frame.addWindowListener(
new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.out.println("你点击了X");
}
} );
2.11、键盘监听
frame.addKeyListener(new KeyAdapter() {
//键盘按下
@Override
public void keyPressed(KeyEvent e) {
//获得键盘按下的键是哪个,当前的码
int keyCode = e.getKeyCode();//不需要去记录这个数值,直接使用KeyEvent.VK_XXX
if(keyCode == KeyEvent.VK_UP){
System.out.println("你按下了上键");
}
}
});
3、Swing
3.1、窗口、面板
JDialog,用来被弹出,默认就有关闭事件
//顶级窗口
JFrame frame = new JFrame("这是一个Jframe窗口");
frame.setVisible(true);
frame.setBounds(100,100,200,200);
frame.setBackground(Color.CYAN);
//设置文字 JLabel
JLabel label = new JLabel("hello");
frame.add(label);
//控制文本在组件中的水平位置 这里是居中对齐
label.setHorizontalAlignment(SwingConstants.CENTER);
//获得一个容器
Container container = getContentPane();
container.setBackground(Color.YELLOW);
//关闭事件
//WindowConstants接口中定义的常量
//EXIT_ON_CLOSE: 当用户关闭窗口时,整个应用程序退出(调用 System.exit(0))
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
3.2、弹窗
//按钮
JButton jButton = new JButton("点击弹出一个对话框");
//点击这个按钮的时候,弹出一个弹窗
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹窗
new MyDialogDemo();
}
});
//弹窗的窗口
class MyDialogDemo extends JDialog {
public MyDialogDemo() {
this.setVisible(true);
this.setBounds(100,100,500, 500);
//WindowsConstants接口中定义的常量
//DISPOSE_ON_CLOSE: 当用户关闭窗口时,窗口被销毁并释放其资源。
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Container container = this.getContentPane();
//设置绝对布局
container.setLayout(null);
container.add(new JLabel("123"));
}
}
3.3、标签
JLabel
new JLabel("")
图标ICON
//图标是一个接口,需要实现类,Frame继承
public class IconDemo extends JFrame implements Icon {
private int width, height;
public IconDemo(){}
public IconDemo(int width, int height){
this.width = width;
this.height = height;
}
public void init(){
IconDemo iconDemo = new IconDemo(15, 15);
//图标放在标签,也可以放在按钮上
JLabel label = new JLabel("icontest", iconDemo, SwingConstants.CENTER);
Container container = getContentPane();
container.add(label);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new IconDemo().init();
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.fillOval(x, y, width, height);
}
@Override
public int getIconWidth() {
return this.width;
}
@Override
public int getIconHeight() {
return this.height;
}
}
3.4、面板
JPanel
Container container= getContentPane();
container.setLayout(new GridLayout(2,2,10,10));//后面两个参数的意思是间距
JPanel jPanel1 = new JPanel(new GridLayout(1,3));
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));
container.add(jPanel1);
JScrollPanel
//文本域
JTextArea textArea = new JTextArea(20,50);
textArea.setText("欢迎学习JScroll");
//SCroll面板
JScrollPane jScrollPane = new JScrollPane(textArea);
contentPanel.add(jScrollPane);
3.5、按钮
-
单选按钮
//单选框
JRadioButton jRadioButton01 = new JRadioButton("jRadioButton01");
JRadioButton jRadioButton02 = new JRadioButton("jRadioButton02");
JRadioButton jRadioButton03 = new JRadioButton("jRadioButton03");
//由于单选框只能选择一个,分组,一个组中只能选择一个
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(jRadioButton01);
buttonGroup.add(jRadioButton02);
buttonGroup.add(jRadioButton03);
-
复选按钮
//多选框
JCheckBox jCheckBox01 = new JCheckBox("jCheckBox01");
JCheckBox jCheckBox02 = new JCheckBox("jCheckBox02");
container.add(jCheckBox01,BorderLayout.NORTH);
container.add(jCheckBox02,BorderLayout.SOUTH);
3.6、列表
-
下拉框
//下拉框
JComboBox status = new JComboBox();
status.addItem(null);
status.addItem("正在热映");
status.addItem("已下架");
status.addItem("即将上映");
-
列表框
//生成列表的内容
String[] contents = {"1","2","3"};
//列表中需要放入内容
JList jList = new JList(contents);
contentPane.add(jList);
///
Vector content = new Vector();
content.add("张三");
content.add("李四");
content.add("王五");
JList jList2 = new JList(content);
contentPane.add(jList2);
-
应用场景
-
选择地区,或者一些单个选项
-
列表,展示信息,一般是动态扩容的
-
3.7、文本框
-
文本框
JTextField jTextField = new JTextField("Hello");
//第一个参数是文本框默认显示的值
//第二个参数是文本框最大长度
JTextField jTextField2 = new JTextField("world",20);
contentPane.add(jTextField,BorderLayout.NORTH);
contentPane.add(jTextField2,BorderLayout.SOUTH);
-
密码框
JPasswordField jPasswordField = new JPasswordField();
//不设置EchoChar也有效果 只是不一样
jPasswordField.setEchoChar('*');
contentPane.add(jPasswordField);
-
文本域
//文本域
JTextArea textArea = new JTextArea();
textArea.setText("hello");
//JScroll面板
JScrollPane scrollPane = new JScrollPane(textArea);
contentPane.add(scrollPane);