GUI 编程
组件:
- 窗口
- 弹窗
- 面板
- 文本框
- 列表框
- 按钮
- 图片
- 监听事件
- 鼠标
- 键盘事件
- 可以写破解工具
简介:
GUI 的核心技术 : swing AWT
缺点: 界面不美观 , 需要jre环境
为什么要学习:
- 我们可以写出心中的一些小工具
- 工作的时候,可能用的到
- 了解MVC架构,了解架构
AWT
GUI :图形用户界面编程
包含了很多类和借口
元素:窗口,按钮,文本框
组件和容器
-
Frame
-
//GUI 的第一个界面 public class TestFrame { public static void main(String[] args) { // Frame Frame frame = new Frame("我的第一个Java图形窗口界面"); // 需要设置可见性 frame.setVisible(true); // 设置窗口大小 frame.setSize(400,400); // 设置背景颜色 frame.setBackground(new Color(19, 212, 30)); // 弹出的初始位置 frame.setLocation(200,200); // 设置大小固定 frame.setResizable(false); } }
-
尝试回顾封装
-
public class TestFrame2 { public static void main(String[] args) { // 展示多个窗口 MyFrame myFrame = new MyFrame(100, 100, 200, 200, Color.blue); MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.YELLOW); MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.BLACK); MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.PINK); } } class MyFrame extends Frame{ static int id = 0;//可能存在多个窗口id,我们需要一个计数器 public MyFrame(int x,int y,int w ,int h,Color color){ super("MyFrame"+(++id)); setBackground(color); setBounds(x,y,w,h); setVisible(true); } }
面板 Panel
-
解决了关闭事件
-
// Panel 可以看成是一个空间,但是不能单独存在 public class TestPanel { public static void main(String[] args) { Frame frame = new Frame(); // 布局的概念 Panel panel = new Panel(); // 设置布局 frame.setLayout(null); // 布局 frame.setBounds(300,300,500,500); frame.setBackground(new Color(243, 4, 4)); // pabel 设置坐标 ,相对于frame panel.setBounds(50,50,400,400); panel.setBackground(new Color(20, 79, 198)); // feame.add(panel) frame.add(panel); frame.setVisible(true); // 监听事件,监听窗口关闭事件 // 适配器模式 frame.addWindowListener(new WindowAdapter() { // 窗口关闭的时候要做的事情 @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
三种布局管理
-
流式布局
-
public class TestFlowLayout { 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"); // 设置为流式布局 // frame.setLayout(new FlowLayout()); frame.setLayout(new FlowLayout(FlowLayout.LEFT)); frame.setSize(200,200); frame.addWindowListener(new WindowAdapter() { // 窗口关闭的时候要做的事情 @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); // 把按钮添加上去 frame.add(button1); frame.add(button2); frame.add(button3); frame.setVisible(true); } }
-
东西南北中
-
public class TestBorderLayout { public static void main(String[] args) { Frame frame = new Frame("TestBorderLayout"); 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.setSize(200,200); frame.setVisible(true); } }
-
表格布局
-
public class TestGridLayout { public static void main(String[] args) { Frame frame = new Frame("TestGridLayout"); Button btn1 = new Button("btn1"); Button btn2 = new Button("btn2"); Button btn3 = new Button("btn3"); Button btn4 = new Button("btn4"); Button btn5 = new Button("btn5"); Button btn6 = new Button("btn6"); frame.setLayout(new GridLayout(3,2)); frame.add(btn1); frame.add(btn2); frame.add(btn3); frame.add(btn4); frame.add(btn5); frame.add(btn6); frame.pack();//java 函数! frame.setVisible(true); } }
事件监听
-
public class TestActionEvent { public static void main(String[] args) { // 按下按钮 触发一些事件 Frame frame = new Frame(); Button button = new Button(); // 因为 addActionListener(); 需要一个 ActionListener ,所以我们需要构造一个 ActionListener MyActionListener myActionListener = new MyActionListener(); button.addActionListener(myActionListener); frame.add(button,BorderLayout.CENTER); frame.pack(); windowClose(frame); frame.setVisible(true); } // 关闭窗体的事件 private static void windowClose(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } // 事件监听 class MyActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { System.out.println("aaa"); } }
-
多个按钮共享一个事件
-
public class TestActionTwo { public static void main(String[] args) { // 两个按钮,实现同一个监听 // 开始 ,停止 Frame frame = new Frame("开始-停止"); Button button1 = new Button("start"); Button button2 = new Button("stop"); // 可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值 // 可以多个按钮只写一个监听类 button2.setActionCommand("button2-stop"); MyMonitor myMonitor = new MyMonitor(); button1.addActionListener(myMonitor); button2.addActionListener(myMonitor); 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) { // e.getActionCommand() 获取按钮点击的信息 System.out.println("按钮被点击了:msg=>"+e.getActionCommand()); } }
输入框
-
public class TestTest01 { public static void main(String[] args) { // 启动 new MyFrame(); } } class MyFrame extends Frame{ public MyFrame(){ TextField textField = new TextField(); add(textField); //监听 这个文本框输入的文字 MyActionListener myActionListener = new MyActionListener(); //按下回车 ,就会触发这个输入框的事件 textField.addActionListener(myActionListener); // 设置替换编码 textField.setEchoChar('*'); setVisible(true); pack(); } } class MyActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { TextField field = (TextField)e.getSource();//获得一些资源,返回了一个对象 System.out.println(field.getText());//获得输入框中的文本 field.setText(""); // null } }
简易计算器+组合内部类复习
-
oop原则:组合,大于继承
-
初始版本
-
//简易计算器 public class TestCalc { public static void main(String[] args) { new Calculator(); } } //计算器类 class Calculator extends Frame{ public Calculator() { // 三个文本框 TextField num1 = new TextField(10);//字符数 TextField num2 = new TextField(10);//字符数 TextField num3 = new TextField(20);//字符数 // 一个按钮 Button button = new Button("="); button.addActionListener(new MyCalculatorListener(num1,num2,num3)); // 一个标签 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; public MyCalculatorListener(TextField num1,TextField num2, TextField num3) { this.num1 = num1; this.num2 = num2; this.num3 = num3; } @Override public void actionPerformed(ActionEvent e) { // 获得加数和被加数 int n1 = Integer.parseInt(num1.getText()); int n2 = Integer.parseInt(num2.getText()); // 将这个值加法运算后方法第三个框 num3.setText(""+(n1+n2)); // 清除前两个框 num1.setText(""); num2.setText(""); } }
-
//简易计算器 public class TestCalc { public static void main(String[] args) { new Calculator().loadFrame(); } } //计算器类 class Calculator extends Frame{ // 属性 TextField num1,num2,num3; // 方法 public void loadFrame(){ // 三个文本框 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 = null; public MyCalculatorListener(Calculator calculator) { this.calculator = calculator; } @Override public void actionPerformed(ActionEvent e) { // 获得加数和被加数 // 将这个值加法运算后方法第三个框 // 清除前两个框 int n1 = Integer.parseInt(calculator.num1.getText()); int n2 = Integer.parseInt(calculator.num1.getText()); calculator.num3.setText(""+(n1+n2)); calculator.num1.setText(""); calculator.num2.setText(""); } }
-
使用组合内部类升级版本
-
//简易计算器 public class TestCalc { public static void main(String[] args) { new Calculator().loadFrame(); } } //计算器类 class Calculator extends Frame{ // 属性 TextField num1,num2,num3; // 方法 public void loadFrame(){ // 三个文本框 num1 = new TextField(10);//字符数 num2 = new TextField(10);//字符数 num3 = new TextField(20);//字符数 Button button = new Button("="); Label label = new Label("+"); button.addActionListener(new MyCalculatorListener()); // 布局 setLayout(new FlowLayout()); add(num1); add(label); add(num2); add(button); add(num3); pack(); setVisible(true); } //监听器类 // 内部类最大的好处,就是可以畅通无阻的访问外部的属性和方法 class MyCalculatorListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // 获得加数和被加数 // 将这个值加法运算后方法第三个框 // 清除前两个框 int n1 = Integer.parseInt(num1.getText()); int n2 = Integer.parseInt(num1.getText()); num3.setText(""+(n1+n2)); num1.setText(""); num2.setText(""); } } }
画笔paint
-
public class TextPaint { public static void main(String[] args) { new MyPaint().LoadFrame(); } } class MyPaint extends Frame{ public void LoadFrame(){ setBounds(200,200,600,500); setVisible(true); } // 画笔 @Override public void paint(Graphics g) { // 画笔 ,需要有颜色,画笔 ,可以画画 // g.setColor(Color.RED); // g.drawOval(100,100,100,100); g.fillOval(100,100,100,100);//实心圆 // g.setColor(Color.GREEN); g.fillRect(150,200,200,200); // 养成习惯,画笔用完,将他还原到最初的颜色 } }
鼠标监听
-
//测试鼠标监听事件 public class TestMouseListener { public static void main(String[] args) { new MyFrame("画图"); } } // 自己的类 class MyFrame extends Frame{ // 画画需要画笔,需要监听鼠标当前的位置,需要集合来存储这个点 ArrayList points; public MyFrame(String title){ super(title); setBounds(200,200,400,300); // 存鼠标点击的点 points = new ArrayList<>(); setVisible(true); // 鼠标监听器,正对这个窗口 this.addMouseListener(new MyMouseListener()); } @Override public void paint(Graphics g) { // 画画,需要监听鼠标的事件 Iterator iterator = points.iterator(); while (iterator.hasNext()){ Point point = (Point) iterator.next(); g.setColor(Color.GREEN); g.fillOval(point.x,point.y,10,10); } } // 添加一个点到界面上 public void addPaint(Point point){ points.add(point); } // 适配器模式 private class MyMouseListener extends MouseAdapter { // 鼠标 : 按下,弹起 ,按住不放 @Override public void mousePressed(MouseEvent e) { MyFrame frame = (MyFrame) e.getSource(); // 这里我们点击的时候就会在界面产生一个点 // 这个点就是鼠标的点 frame.addPaint(new Point(e.getX(),e.getY())); // 每次点击鼠标都需要重新画一遍 frame.repaint();//刷新 } } }
窗口监听
-
public class TestWindow { public static void main(String[] args) { new WindowFrame(); } } class WindowFrame extends Frame{ public WindowFrame(){ setBackground(Color.BLACK); setBounds(100,100,200,200); setVisible(true); // addWindowListener(new MyWindowListener()); this.addWindowListener( // 匿名内部类 new WindowAdapter() { // 关闭窗口 @Override public void windowClosing(WindowEvent e) { System.out.println("windowClosing"); System.exit(0); } // 激活窗口 @Override public void windowActivated(WindowEvent e) { WindowFrame source = (WindowFrame) e.getSource(); source.setTitle("被激活了"); System.out.println("windowActivated"); } } ); } }
键盘监听
-
//键 public class TestKeyListener { public static void main(String[] args) { new KeyFrame(); } } class KeyFrame extends Frame{ public KeyFrame() { super(); setBounds(1,2,300,400); setVisible(true); this.addKeyListener(new KeyAdapter() { // 键盘按下 @Override public void keyPressed(KeyEvent e) { // 获得键盘按下的键是哪一个,当前键盘的码 int keyCode = e.getKeyCode(); System.out.println(keyCode);//不需要去记录这个数值,直接使用静态属性 VK_XXX if (keyCode == KeyEvent.VK_UP){ System.out.println("你按下了上键"); } // 根据按下不同的按键,获取不同的结果: } }); } }
Swing之JFrame窗体
-
package com.AWT4; import javax.swing.*; import java.awt.*; public class JFrameDemo { // int();初始化 public void init(){ JFrame jf = new JFrame("这是一个JFrame窗口"); jf.setVisible(true); jf.setBounds(100,100,200,200); jf.setBackground(Color.BLACK); // 关闭事件 jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { // 建立一个窗口 new JFrameDemo().init(); } }
-
设置标签居中
-
public class JFrameDemo02 { public static void main(String[] args) { new MyJframe2().init(); } } class MyJframe2 extends JFrame{ public void init(){ this.setBounds(10,10,200,300); this.setVisible(true); // 设置文字 JLabel JLabel label = new JLabel("欢迎来到java"); this.add(label); // 让文本标签居中 label.setHorizontalAlignment(SwingConstants.CENTER); // 获得一个容器 Container contentPane = this.getContentPane(); contentPane.setBackground(Color.GREEN); } }
JDialog 弹窗
-
//主窗口 public class DialogDemo extends JFrame { public DialogDemo() { this.setVisible(true); this.setSize(700,500); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // JFrame 放东西, 容器 Container container = this.getContentPane(); // 绝对布局 container.setLayout(null); // 按钮 JButton jButton = new JButton("点击弹出一个对话框");//创建 jButton.setBounds(30,30,200,50); // 点击这个按钮的时候,弹出一个弹窗 jButton.addActionListener(new ActionListener() {//监听器 @Override public void actionPerformed(ActionEvent e) { // 弹窗 new MyDialogDemo(); } }); container.add(jButton); } public static void main(String[] args) { new DialogDemo(); } } //弹窗的窗口 class MyDialogDemo extends JDialog{ public MyDialogDemo() { this.setVisible(true); this.setBounds(100,100,300,500); // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); Container container = this.getContentPane(); container.setLayout(null); container.add(new JLabel("这是一个点开就会出现的提示")); } }
标签
-
label
- new label(“xxx”);
-
图标
-
//图标,需要实现类,Frame 继承 public class IconDemo extends JFrame implements Icon { private int width; private int 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); } @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; } public static void main(String[] args) { new IconDemo().init(); } }
-
图片
-
public class ImageIconDemo extends JFrame { public ImageIconDemo(){ // 获取图片的地址 JLabel label = new JLabel("ImageuIcon"); URL url = ImageIconDemo.class.getResource("tx.jpg"); ImageIcon imageIcon = new ImageIcon(url);//命名不要冲突 label.setIcon(imageIcon); label.setHorizontalAlignment(SwingConstants.CENTER); Container container = getContentPane(); container.add(label); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setBounds(100,100,200,200); } public static void main(String[] args) { new ImageIconDemo(); } }
面板
-
JPanel
-
public class JPanelDemo extends JFrame { public JPanelDemo() { Container container = this.getContentPane(); container.setLayout(new GridLayout(2,1,10,10));//后面的参数的意思是间距 JPanel panel1 = new JPanel(new GridLayout(1,3)); JPanel panel2 = new JPanel(new GridLayout(1,2)); JPanel panel3 = new JPanel(new GridLayout(2,1)); JPanel panel4 = new JPanel(new GridLayout(3,2)); panel1.add(new JButton("1")); panel1.add(new JButton("1")); panel1.add(new JButton("1")); panel2.add(new JButton("2")); panel2.add(new JButton("2")); panel3.add(new JButton("2")); panel3.add(new JButton("2")); panel4.add(new JButton("2")); panel4.add(new JButton("2")); container.add(panel1); container.add(panel2); container.add(panel3); container.add(panel4); this.setVisible(true); this.setSize(500,500); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new JPanelDemo(); } }
-
JScrollPanel
-
public class JScrollDemo extends JFrame { public JScrollDemo() { Container container = this.getContentPane(); // 文本域 JTextArea textArea = new JTextArea(20, 50); textArea.setText("欢迎学习java"); // Scroll面板 JScrollPane scrollPane = new JScrollPane(textArea); container.add(scrollPane); this.setVisible(true); this.setBounds(100,100,300,500); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new JScrollDemo(); }
-
滚动条面板
-
public class JScrollDemo extends JFrame { public JScrollDemo() { Container container = this.getContentPane(); // 文本域 JTextArea textArea = new JTextArea(20, 50); textArea.setText("欢迎学习java"); // Scroll面板 JScrollPane scrollPane = new JScrollPane(textArea); container.add(scrollPane); this.setVisible(true); this.setBounds(100,100,300,500); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new JScrollDemo(); } }
按钮
-
图片按钮
-
public class JButtonDemo01 extends JFrame { public JButtonDemo01() { Container container = this.getContentPane(); // 将一个图片变为图标 URL resource = JButtonDemo01.class.getResource("tx.jpg"); ImageIcon icon = new ImageIcon(resource); // 把这个图标放在按钮上 JButton button = new JButton(); button.setIcon(icon); button.setToolTipText("这是一个图片按钮"); // add container.add(button); this.setVisible(true); this.setSize(500,300); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new JButtonDemo01(); }
-
单选框按钮
-
public class JButtonDemo02 extends JFrame { public JButtonDemo02() { Container container = this.getContentPane(); // 将一个图片变为图标 URL resource = com.AWT5.JButtonDemo01.class.getResource("tx.jpg"); ImageIcon icon = new ImageIcon(resource); // 单选框 JRadioButton radioButton01 = new JRadioButton("JRadioButton01"); JRadioButton radioButton02 = new JRadioButton("JRadioButton02"); JRadioButton radioButton03 = new JRadioButton("JRadioButton03"); // 由于单选框只能选择一个,分组,一个组中只能选择一个 ButtonGroup group = new ButtonGroup(); group.add(radioButton01); group.add(radioButton02); group.add(radioButton03); container.add(radioButton01,BorderLayout.CENTER); container.add(radioButton02,BorderLayout.NORTH); container.add(radioButton03,BorderLayout.SOUTH); this.setVisible(true); this.setSize(500,300); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new com.AWT5.JButtonDemo02(); } }
-
多选框按钮
-
public class JButtonDemo03 extends JFrame { public JButtonDemo03() { Container container = this.getContentPane(); // 将一个图片变为图标 URL resource = com.AWT5.JButtonDemo01.class.getResource("tx.jpg"); ImageIcon icon = new ImageIcon(resource); // 多选框 JCheckBox checkBox01 = new JCheckBox("checkBox1"); JCheckBox checkBox02 = new JCheckBox("checkBox2"); JCheckBox checkBox03 = new JCheckBox("checkBox3"); container.add(checkBox01,BorderLayout.NORTH); container.add(checkBox02,BorderLayout.SOUTH); container.add(checkBox03,BorderLayout.CENTER); this.setVisible(true); this.setSize(500,300); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new com.AWT5.JButtonDemo03(); } }
列表
-
下拉框
-
public class TestComboboxDemo01 extends JFrame { public TestComboboxDemo01() { Container container = this.getContentPane(); JComboBox status = new JComboBox(); status.addItem(null); status.addItem("正在上映"); status.addItem("已下架"); status.addItem("正在热映"); container.add(status); this.setVisible(true); this.setSize(500,350); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestComboboxDemo01(); } }
-
列表框
-
public class TestComboboxDemo02 extends JFrame { public TestComboboxDemo02() { Container container = this.getContentPane(); // 生成列表的内容 // String[] contents = {"1","2","3"}; Vector contents = new Vector(); // 列表中需要放入内容 JList jList = new JList(contents); contents.add("张三"); contents.add("李四"); contents.add("王五"); container.add(jList); this.setVisible(true); this.setSize(500,350); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestComboboxDemo02(); } }
-
应用场景:
- 选择地区,或者一些单个选项
- 列表,展示信息,一般是动态扩容
文本框
-
文本框
-
public class TestTextDemo01 extends JFrame { public TestTextDemo01() { Container container = this.getContentPane(); JTextField textField = new JTextField("hello"); JTextField textField2 = new JTextField("world",20); container.add(textField,BorderLayout.NORTH); container.add(textField2,BorderLayout.CENTER); this.setVisible(true); this.setSize(500,350); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestTextDemo01(); } }
-
密码框
-
public class TestTextDemo02 extends JFrame { public TestTextDemo02() { Container container = this.getContentPane(); JPasswordField passwordField = new JPasswordField(); passwordField.setEchoChar('*'); container.add(passwordField); this.setVisible(true); this.setSize(500,350); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestTextDemo02(); } }
-
文本域
-
public class JScrollDemo extends JFrame { public JScrollDemo() { Container container = this.getContentPane(); // 文本域 JTextArea textArea = new JTextArea(20, 50); textArea.setText("欢迎学习java"); // Scroll面板 JScrollPane scrollPane = new JScrollPane(textArea); container.add(scrollPane); this.setVisible(true); this.setBounds(100,100,300,500); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new JScrollDemo(); } }