@ GUI编程
1.简介
Gui的核心技术: Swing(做了封装) AWT(更底层的东西)
为什么现在不常用了?
- 因为界面不美观
- 需要jre环境(消耗内存)
为什么我们要学习?
- 可以写出自己心中想要的一些小工具
- 工作时候,也可能需要维护到Swing界面,概率极小
- 了解MVC架构,了解监听!
2. AWT
#### 2.1 Awt简介
- 包含了很多类和接口
- 元素:窗口(Frame),按钮(Button),文本框(TextField)
- java.awt.*;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePR3V3jE-1608307810927)(C:\Users\user\Desktop\Java截图\QQ截图20201215165113.png)]
2.2 组件和容器
##### 1. Frame窗口
<img src="C:\Users\user\Desktop\Java截图\QQ截图20201215173228.png" style="zoom:200%;" />
2. Panel面板
- 解决了关闭窗口事件
public static void main(String[] args) {
Frame frame = new Frame("我的第一个GUI界面");
//panel可以看成一个空间,但不能单独存在
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
frame.setBounds(100,100,500,500);
frame.setBackground(new Color(25, 74, 251));
//panel设置坐标,相对于frame
panel.setBounds(50,50,400,400);
panel.setBackground(new Color(22, 197, 22));
frame.add(panel);
frame.setVisible(true);
//添加窗口监听事件,检测窗口关闭时退出程序
//适配器模式 WindowAdapter
frame.addWindowListener(new WindowAdapter() {
//窗口点击关闭的时候需要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
3. 布局管理器(LayoutManager)
1. 流式布局(FlowLayout)
public static void main(String[] args) {
Frame frame= new Frame("我的GUI界面");
//组件-按钮
Button button = new Button("button1");
Button button1 = new Button("button2");
Button button2 = new Button("button3");
//设置布局方式为流式布局,默认居中
// frame.setLayout(new FlowLayout());
//居左
//frame.setLayout(new FlowLayout(FlowLayout.LEFT));
//居右
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
//添加组件
frame.add(button);
frame.add(button1);
frame.add(button2);
frame.setVisible(true);
frame.setSize(300,300);
}
2. 表格布局(GridLayout)
public static void main(String[] args) {
Frame frame = new Frame();
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
Button button4 = new Button("button4");
Button button5 = new Button("button5");
Button button6 = new Button("button6");
frame.setLayout(new GridLayout(3,2));//3行2列
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.add(button5);
frame.add(button6);
frame.pack();//自动控制窗口大小
frame.setVisible(true);
}
3. 东南西北中 BorderLayout
public static void main(String[] args) {
Frame frame = new Frame("GUI界面");
Button east = new Button("East");
Button west = new Button("West");
Button south = new Button("South");
Button north = new Button("North");
Button center = new Button("Center");
frame.add(east,BorderLayout.EAST);
frame.add(west,BorderLayout.WEST);
frame.add(south,BorderLayout.SOUTH);
frame.add(north,BorderLayout.NORTH);
frame.add(center,BorderLayout.CENTER);
frame.setVisible(true);
frame.setSize(200,200);
}
案例:
public static void main(String[] args) {
//创建窗口
Frame frame = new Frame();
//设置窗口布局方式为GridLayout,2行1列
frame.setLayout(new GridLayout(2,1));
frame.setVisible(true);
frame.setSize(500,500);
frame.setBackground(Color.blue);
frame.setLocation(300,300);
//设置4个面板
Panel panel = new Panel(new BorderLayout());
Panel panel1 = new Panel(new GridLayout(2,1));
Panel panel2 = new Panel(new BorderLayout());
Panel panel3 = new Panel(new GridLayout(2,2));
//上部分面板添加按钮
panel.add(new Button("West-1"),BorderLayout.WEST);
panel.add(new Button("East-2"),BorderLayout.EAST);
panel1.add(new Button("bt-1"));
panel1.add(new Button("bt-2"));
panel.add(panel1,BorderLayout.CENTER);
//下部分面板添加按钮
panel2.add(new Button("West-3"),BorderLayout.WEST);
panel2.add(new Button("East-4"),BorderLayout.EAST);
for (int i = 0; i < 4; i++) {
panel3.add(new Button("button"+i));
}
panel2.add(panel3, BorderLayout.CENTER);
//把面板添加到窗口
frame.add(panel);
frame.add(panel2);
//触发关闭窗口事件监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
总结:
1. Frame是一个顶级窗口
2. Panel无法单独显示,必须添加到某个容器中
3. 布局管理器
4. 窗口/面板的大小,背景颜色,是否可见,初始位置(定位),关闭窗口事件监听
4. 事件监听(ActionListener)
多个按钮,共享一个事件监听
package com.kuang.lesson2;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileReader;
public class TestActionListener2 {
public static void main(String[] args) {
//两个按钮,实现同一个监听
Frame frame = new Frame();
Button button = new Button("button1");
Button button2 = new Button("button2");
//用于显式的定义触发后返回的命令,如果不显式定义,则走默认值
//可以多个按钮共享一个事件监听
button.setActionCommand("执行命令");
button.addActionListener(new MyMonitor());
button2.addActionListener(new MyMonitor());
frame.add(button,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//getActionCommand()获取按钮的信息
System.out.println("按钮被点击了,"+e.getActionCommand());
}
}
5. 文本框 TextField监听
package com.kuang.lesson2;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyFrame extends Frame {
public MyFrame(){
//文本框事件监听
TextField field = new TextField();
//设置替换编码
field.setEchoChar('*');
//添加监听器,回车后会触发监听
field.addActionListener(new MyActionListener());
add(field);
pack();
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
TextField field = (TextField)e.getSource();//该方法返回一个Object对象
//通过监听获取文本框的文本
System.out.println("文本框,"+field.getText());
field.setText("");//文本为空
}
}
6. 简易计算器,组合+内部类回顾复习!
组合大于继承,耦合性更低。组合就是一个类中声明另外一个类
package com.kuang.lesson2;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 简易计算器
*/
public class Calculator extends Frame {
private TextField num1,num2,num3;
public void loadCalculator(){
//3个变量
num1 = new TextField();
num2 = new TextField();
num3 = new TextField();
//一个标签
new Label("+");
//一个按钮,点击触发求和事件监听
Button button = new Button("=");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int one = Integer.parseInt(num1.getText());
int two = Integer.parseInt(num2.getText());
num3.setText(""+(one+two));
num1.setText("");
num2.setText("");
}
});
setLayout(new FlowLayout(FlowLayout.CENTER));
add(num1);
add(new Label("+"));
add(num2);
add(button);
add(num3);
setVisible(true);
pack();
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new Calculator().loadCalculator();
}
}
7. 画笔(Graphics g)
package com.kuang.lesson3;
import java.awt.*;
public class TestPaint {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
class MyPaint extends Frame{
public void loadFrame(){
setBounds(200,200,600,500);
setVisible(true);
}
public void paint(Graphics g){
//画笔用完,将它还原为最初的颜色(黑色)
//g.setColor(Color.RED);
g.drawOval(100,100,100,100);//画空心圆
g.fillOval(100,200,200,200);//画实心圆
g.drawRect(100,400,100,100);//画空心矩形
g.fillRect(100,500,100,100);//画实心矩形
}
}
8. 鼠标监听(mouseListener)
目的:想要实现鼠标画画
package com.kuang.lesson2;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class TestMouseListener {
public static void main(String[] args) {
new MyMouse("鼠标画点");
}
}
class MyMouse extends Frame{
private ArrayList points;
public MyMouse(String title){
super(title);
points = new ArrayList();
this.setVisible(true);
this.setBounds(200,200,600,500);
this.addMouseListener(new MouseAdapter() {
//鼠标 按下,点击,弹起
@Override
public void mousePressed(MouseEvent e) {
//鼠标按下
MyMouse mouse = (MyMouse) e.getSource();
mouse.addPoint(new Point(e.getX(),e.getY()));
mouse.repaint();
}
});
}
//画笔
public void paint(Graphics g){
Iterator iterator = points.iterator();
while(iterator.hasNext()){
Point p = (Point) points.iterator().next();
g.setColor(Color.blue);
g.fillOval(p.x,p.y,10,10);
}
}
//把点添加到集合中
public void addPoint(Point p){
points.add(p);
}
}
9. 窗口监听(windowListener)
package com.kuang.lesson2;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
* 窗口监听
* 关闭窗口,激活窗口
*/
public class TestWindow {
public static void main(String[] args) {
new WindowFrame();
}
}
class WindowFrame extends Frame{
public WindowFrame(){
setVisible(true);
setBounds(200,200,100,100);
addWindowListener(new WindowAdapter() {//WindowAdapter是适配器模式
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);//隐藏窗口
System.out.println("正在关闭");
System.exit(0);
}
//激活窗口
@Override
public void windowActivated(WindowEvent e) {
WindowFrame fr= (WindowFrame) e.getSource();
fr.setTitle("已激活");
}
});
}
}
10. 键盘监听(keyListener)
package com.kuang.lesson2;
import javax.xml.bind.SchemaOutputResolver;
import java.awt.*;
import java.awt.event.*;
/**
* 键盘监听
*/
public class TestKey {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame{
public KeyFrame(){
setVisible(true);
setBounds(1,2,200,200);
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//监听键盘上的当前某个键,获取键盘码
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if(keyCode == KeyEvent.VK_UP){//使用常量VK_XX
System.out.println("UP键按下了");
}
}
});
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
3. Swing
- javax.swing.*;
- 必须创建一个容器Container,将JFrame添加进去,通过该容器操作元素
3.1 窗口、面板
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
/**
* JFrame
* 创建窗口
*/
public class MyJFrame extends JFrame {
public MyJFrame(String title){
super(title);
}
public void init(){
JLabel label = new JLabel("欢迎来到狂神说java");
//让文本标签居中显示
label.setHorizontalAlignment(SwingConstants.CENTER);//居中
add(label);
setVisible(true);
setBounds(1,2,200,200);
//关闭窗口
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//获得一个容器
Container container = this.getContentPane();
container.setBackground(Color.BLUE);
}
public static void main(String[] args) {
//创建了一个窗口
new MyJFrame("我的第一个JFrame窗口").init();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ajGKPjWO-1608307810957)(C:\Users\user\Desktop\Java截图\QQ截图20201218142408.png)]
3.2 弹窗(Dialog)
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 弹窗
* 在当前窗口中点击按钮,弹出一个新窗口
*/
public class MyDialogDemo extends JFrame {
public MyDialogDemo(){
setVisible(true);
setSize(700,500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton jButton = new JButton("弹窗");
jButton.setBounds(50,30,200,100);
//获得一个容器
Container container = this.getContentPane();
//绝对布局
container.setLayout(null);
container.add(jButton);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹窗
new MyDialog();
}
});
}
public static void main(String[] args) {
new MyDialogDemo();
}
}
class MyDialog extends JDialog{
public MyDialog(){
setVisible(true);
setSize(300,300);
JLabel jLabel = new JLabel("我的标签");
jLabel.setSize(100,50);
//获得一个容器
Container container = this.getContentPane();
container.setLayout(null);
container.add(jLabel);
container.setBackground(Color.yellow);
}
}
3.3 标签 JLabel
1. new JLabel(" ");
图标 Icon
- 图片图标 ImageIcon
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
/**
* 图片图标 ImageIcon
* 把图标添加到标签上
*/
public class MyImageIcon extends JFrame {
public MyImageIcon(){
setVisible(true);
setBounds(0,0,500,500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//获取当前类下图片的地址
URL url= MyImageIcon.class.getResource("tx.png");
ImageIcon icon = new ImageIcon(url);
JLabel jLabel = new JLabel("ImageIcon");
jLabel.setIcon(icon);
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
//获得一个容器
Container container = this.getContentPane();
container.add(jLabel);
}
public static void main(String[] args) {
new MyImageIcon();
}
}
3.4 面板JPanel
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
/**
* 面板 JPanel
* 添加按钮到面板
*/
public class JPanelDemo extends JFrame {
public JPanelDemo(){
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container = this.getContentPane();
container.setLayout(new GridLayout(2,1,10,10));//最后两个参数是间距
JPanel jPanel1 = new JPanel(new GridLayout(1,3));
JPanel jPanel2 = new JPanel(new GridLayout(1,2));
JPanel jPanel3 = new JPanel(new GridLayout(2,3));
JPanel jPanel4 = new JPanel(new GridLayout(1,1));
jPanel1.add(new JButton("jb1"));
jPanel1.add(new JButton("jb1"));
jPanel1.add(new JButton("jb1"));
jPanel2.add(new JButton("jb2"));
jPanel2.add(new JButton("jb2"));
jPanel3.add(new JButton("jb3"));
jPanel3.add(new JButton("jb3"));
jPanel3.add(new JButton("jb3"));
jPanel3.add(new JButton("jb3"));
jPanel3.add(new JButton("jb3"));
jPanel3.add(new JButton("jb3"));
jPanel4.add(new JButton("jb4"));
container.add(jPanel1);
container.add(jPanel2);
container.add(jPanel3);
container.add(jPanel4);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
3.4.1 滚动面板 JScrollPane ,文本域 JTextArea
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
/**
* JScrollPane 滚动面板,只有在超过指定范围之后才会显示滚动条
*/
public class JScrollPaneDemo extends JFrame {
public JScrollPaneDemo(){
setVisible(true);
setBounds(50,50,300,350);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//文本域
JTextArea jTextArea = new JTextArea(20,50);
//设置默认文本
jTextArea.setText("欢迎来到狂神说java");
//把文本域添加到滚动面板
JScrollPane jScrollPane = new JScrollPane(jTextArea);
Container container = this.getContentPane();
container.add(jScrollPane);
}
public static void main(String[] args) {
new JScrollPaneDemo();
}
}
3.5 按钮 JButton
-
图片按钮
package com.kuang.lesson4; import javax.swing.*; import java.awt.*; import java.net.URL; /** * 图片按钮 * 把图标添加到按钮上 */ public class TestJButton extends JFrame { public TestJButton(){ Container container = this.getContentPane(); //将一个图片变为图标 URL url = TestJButton.class.getResource("tx.png"); //Icon是一个接口 Icon icon = new ImageIcon(url);//向上造型 JButton jButton = new JButton(icon); container.add(jButton); setVisible(true); setBounds(100,100,200,300); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestJButton(); } }
-
单选按钮 JRadioButton
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class TestJRadioButton extends JFrame {
public TestJRadioButton(){
Container container = this.getContentPane();
//3个单选按钮
JRadioButton jRadioButton1 = new JRadioButton("bt1");
JRadioButton jRadioButton2 = new JRadioButton("bt2");
JRadioButton jRadioButton3 = new JRadioButton("bt3");
//分组,把单选按钮添加到一个ButtonGroup组里,每次只能选择一个按钮
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(jRadioButton1);
buttonGroup.add(jRadioButton2);
buttonGroup.add(jRadioButton3);
container.add(jRadioButton1,BorderLayout.NORTH);
container.add(jRadioButton2,BorderLayout.CENTER);
container.add(jRadioButton3,BorderLayout.SOUTH);
setVisible(true);
setBounds(100,100,200,300);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestJRadioButton();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFv1KRb0-1608307810965)(C:\Users\user\Desktop\Java截图\QQ截图20201218181113.png)]
-
多选按钮 JCheckBox
package com.kuang.lesson4; import javax.swing.*; import java.awt.*; /** * 多选框 */ public class JCheckBoxDemo extends JFrame { public JCheckBoxDemo(){ Container container = this.getContentPane(); //多选框 JCheckBox jCheckBox1 = new JCheckBox("bt1"); JCheckBox jCheckBox2 = new JCheckBox("bt2"); JCheckBox jCheckBox3 = new JCheckBox("bt3"); //设置为流式布局 container.setLayout(new FlowLayout()); container.add(jCheckBox1); container.add(jCheckBox2); container.add(jCheckBox3); setVisible(true); setBounds(100,100,200,300); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new JCheckBoxDemo(); } }
3.6 列表框和下拉框
- 下拉框 JComboBox
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* 下拉框
*/
public class JComboBoxDemo extends JFrame {
public JComboBoxDemo(){
Container container = this.getContentPane();
JComboBox jComboBox = new JComboBox();
jComboBox.addItem("正在热映");
jComboBox.addItem("已下架");
jComboBox.addItem("即将上映");
jComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JComboBox comboBox = (JComboBox) e.getSource();
//获取当前选中的一项
String item = (String)comboBox.getSelectedItem();
System.out.println(item);
}
});
container.add(jComboBox);
setVisible(true);
setSize(300,100);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JComboBoxDemo();
}
}
- 列表框 JList
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
import java.util.Vector;
public class JListDemo extends JFrame {
public JListDemo(){
Container container = this.getContentPane();
//Vector可实现自动增长的对象数组。 java.util.vector提供了向量类(Vector)以实现类似动态数组的功能
Vector contents = new Vector();
JList jList = new JList(contents);
contents.add("篮球");
contents.add("足球");
contents.add("排球");
container.add(jList);
setVisible(true);
setSize(300,100);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JListDemo();
}
}
-
应用场景
-
下拉框 :选择地区
-
列表框 :展示信息,一般是动态扩容的!
-
3.7 文本框
- 文本框 JTextField
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
public class JTextFieldDemo extends JFrame {
public JTextFieldDemo(){
Container container = this.getContentPane();
JTextField jTextField1 = new JTextField("Hello,World!",20);
JTextField jTextField2 = new JTextField("欢迎来到Java王国!",30);
container.add(jTextField1,BorderLayout.NORTH);
container.add(jTextField2,BorderLayout.SOUTH);
setVisible(true);
setSize(400,300);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JTextFieldDemo();
}
}
- 密码框 JPasswordField
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
public class JPasswordFieldDemo extends JFrame {
public JPasswordFieldDemo(){
Container container = this.getContentPane();
//通过面板添加文本框,密码框
JPasswordField jPasswordField = new JPasswordField("123456");
//设置替换编码
jPasswordField.setEchoChar('*');
container.add(jPasswordField);
setVisible(true);
setSize(300,200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPasswordFieldDemo();
}
}
- 文本域
package com.kuang.lesson4;
import javax.swing.*;
import java.awt.*;
/**
* JScrollPane 滚动面板,只有在超过指定范围之后才会显示
*/
public class JScrollPaneDemo extends JFrame {
public JScrollPaneDemo(){
//文本域
JTextArea jTextArea = new JTextArea(20,50);
//设置默认文本
jTextArea.setText("欢迎来到狂神说java");
//把文本域添加到滚动面板
JScrollPane jScrollPane = new JScrollPane(jTextArea);
Container container = this.getContentPane();
container.add(jScrollPane); setVisible(true);
setBounds(50,50,300,350);
//关闭窗口事件监听
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollPaneDemo();
}
}