JavaGUI编程 学习笔记(202109.28~10.10)

GUI编程

零、组件

  • 窗口
  • 弹窗
  • 面板
  • 文本框
  • 列表框
  • 按钮
  • 图片
  • 监听事件
  • 鼠标
  • 键盘事件

一、简介

GUI核心技术:Swing、AWT,不流行、界面不美观

  1. 不美观
  2. 要环境

为什么要学?

  1. 可以写自己的小工具
  2. 工作可能需要维护这个Swing
  3. 了解MVC架构,了解监听!(重点

二、AWT

1. AWT介绍

  1. 包含了很多类和接口!GUI:图形用户界面编程
  2. 元素:窗口,按钮,文本框
  3. image

Eclipse:JAVA写的

2. 组件和容器

2.1 Frame

package com.xiaowei9s.lesson01;

import java.awt.*;

//GUI的第一个界面
public class TestFrame {
    public static void main(String[] args) {
        //Frame
        Frame f1 = new Frame("我的第一个Java图形界面");

        //需要设置可见性
        f1.setVisible(true);

        //设置窗口大小
        f1.setSize(400,400);

        //设置背景颜色
        f1.setBackground(new Color(45, 62, 168));

        //弹出的初始位置
        f1.setLocation(200,200);

        //设置大小固定
        f1.setResizable(false);
    }
}

问题:无法关闭窗口

回顾并且尝试封装

package com.xiaowei9s.lesson01;

import java.awt.*;

public class TestFrame2 {
    public static void main(String[] args) {
        MyFrame myFrame1 = new MyFrame(400, 400, 200, 200, Color.BLUE);
        MyFrame myFrame2 = new MyFrame(400, 600, 200, 200, Color.RED);
        MyFrame myFrame3 = new MyFrame(600, 400, 200, 200, Color.MAGENTA);
        MyFrame myFrame4 = new MyFrame(600, 600, 200, 200, Color.green);
    }
}

class MyFrame extends Frame {
    static int id = 0;
    public MyFrame(int x,int y,int w,int h,Color color){

        super("MyFrame"+(++id));
        setBackground(color);
        setBounds(x,y,w,h);
        setResizable(false);
        setVisible(true);
    }
}

运行结果:

image

2.2 面板Panel

package com.xiaowei9s.lesson01;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

//Panel是一个空间,它不能单独存在
public class TestPanel {
    public static void main(String[] args) {
        Frame frame = new Frame();
        //布局的概念
        Panel panel = new Panel();

        //设置布局
        frame.setLayout(null);

        //坐标
        frame.setBounds(400,400,400,400);
        frame.setBackground(new Color(38, 70, 129));

        //设置panel坐标,相对于frame
        panel.setBounds(50,50,300,300);
        panel.setBackground(Color.green);

        frame.add(panel);

        frame.setVisible(true);

        //监听事件,监听关闭窗口事件
        //适配器模式:需要什么用什么,不用全部写
        frame.addWindowListener(new WindowAdapter() {//需要什么new什么
            //窗口关闭时要做的事情
            @Override
            public void windowClosing(WindowEvent e) {/
                System.exit(0);
            }
        });


    }
}

3. 布局管理器

  • 流式布局

  • 东南西北中

  • 表格布局

  • 设置流式布局:

package com.xiaowei9s.lesson01;

import java.awt.*;

public class TestFlowLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("流式布局");
        frame.setBounds(100,100,500,500);
        //frame.setLayout(new FlowLayout());
        //frame.setLayout(new FlowLayout(FlowLayout.LEFT));
        //frame.setLayout(new FlowLayout(FlowLayout.CENTER));
        frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
        frame.add(new Button("btn1"));
        frame.add(new Button("btn2"));
        frame.add(new Button("btn3"));

        frame.setVisible(true);
    }
}
  • 设置东南西北中
package com.xiaowei9s.lesson01;

import java.awt.*;

public class TestBorderLayout {
    public static void main(String[] args) {
        Frame testBorderLayout = new Frame("TestBorderLayout");
        testBorderLayout.setBounds(400,400,400,400);
        testBorderLayout.setLayout(new BorderLayout());
        testBorderLayout.add(new Button("west"),BorderLayout.WEST);
        testBorderLayout.add(new Button("east"),BorderLayout.EAST);
        testBorderLayout.add(new Button("south"),BorderLayout.SOUTH);
        testBorderLayout.add(new Button("north"),BorderLayout.NORTH);
        testBorderLayout.add(new Button("center"),BorderLayout.CENTER);

        testBorderLayout.setVisible(true);

    }
}
  • 设置表格布局Grid
package com.xiaowei9s.lesson01;

import java.awt.*;

public class TestGridLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("TestGridLayout");
        frame.setBounds(400,400,400,400);
        GridLayout gridLayout = new GridLayout(3,2);
        frame.setLayout(gridLayout);
        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.add(btn1);
        frame.add(btn2);
        frame.add(btn3);
        frame.add(btn4);
        frame.add(btn5);
        frame.add(btn6);
        frame.pack();//自动填充

        frame.setVisible(true);
    }
}

作业:

image

参考答案:

package com.xiaowei9s.lesson01;

import java.awt.*;

public class TestLayoutWork {
    public static void main(String[] args) {
        Frame frame = new Frame("TestLayoutWork");
        frame.setBounds(400,400,400,400);

        BorderLayout borderLayout = new BorderLayout();
        frame.setLayout(borderLayout);
        //左
        Panel lpanel = new Panel(new GridLayout(2,1));
        lpanel.add(new Button("btn1"));
        lpanel.add(new Button("btn2"));
        frame.add(lpanel,BorderLayout.WEST);
        //中
        Panel cpanel = new Panel(new GridLayout(4,1));//四行一列
        cpanel.add(new Button("btn1"));//第一行
        cpanel.add(new Button("btn2"));//第二行

        Panel c1 = new Panel(new GridLayout(1, 2));//第三行是一行两列
        c1.add(new Button("btn1"));
        c1.add(new Button("btn2"));
        cpanel.add(c1);//第三行
        
        Panel c2 = new Panel(new GridLayout(1, 2));//第四行是一行两列
        c2.add(new Button("btn3"));
        c2.add(new Button("btn4"));
        cpanel.add(c2);//第四行
        frame.add(cpanel,BorderLayout.CENTER);
        //右
        Panel rpanel = new Panel(new GridLayout(2,1));
        rpanel.add(new Button("btn3"));
        rpanel.add(new Button("btn4"));
        frame.add(rpanel,BorderLayout.EAST);
        frame.setVisible(true);
    }
}

总结

  1. Frame是顶级窗口。
  2. Panel无法单独显示
  3. 布局管理器
    1. 流式布局
    2. 方位布局
    3. 栅格(表格)布局

4. 事件监听

事件监听:发生某些事的时候做什么?

package com.xiaowei9s.lesson01;

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 TestActionEvent {
    public static void main(String[] args) {
        Frame frame = new Frame("TestActionEvent");
        Button button = new Button("btn1");
        button.addActionListener(new MyActionListener());//按钮加入监听
        frame.add(button);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class MyActionListener implements ActionListener {//监听类需要实现ActionListener

    @Override
    public void actionPerformed(ActionEvent e) {//监听事件
        System.out.println(123);
    }
}

ActionEvent e能获得什么?

package com.xiaowei9s.lesson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestActionTwo {
    public static void main(String[] args) {
        Frame frame = new Frame("开始-停止");
        frame.setLayout(new FlowLayout());
        Button btn1 = new Button("开始");
        btn1.setActionCommand("开始按钮");
        btn1.addActionListener(new MyMonitor());
        Button btn2 = new Button("停止");
        btn2.setActionCommand("停止按钮");
        btn2.addActionListener(new MyMonitor());
        frame.add(btn1);
        frame.add(btn2);
        frame.setVisible(true);
    }
}
class MyMonitor implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("msg=>"+e.getActionCommand());
    }
}

5. 输入框

package com.xiaowei9s.lesson02;

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 TestText01 {
    public static void main(String[] args) {
        new MyFrame();//启动
    }
}

class MyFrame extends Frame {
    public MyFrame() throws HeadlessException {
        TextField textField = new TextField();
        MyActionListener1 actionListener1 = new MyActionListener1();
        textField.addActionListener(actionListener1);
        textField.setEchoChar('*');
        add(textField);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });


        setVisible(true);
        pack();
    }
}

class MyActionListener1 implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        TextField textField = (TextField) e.getSource();
        System.out.println(textField.getText());
        textField.setText("");
    }
}

6. 简易计算器+组合、内部类回顾

oop原则:组合大于继承!

class A extends B{//继承
    
}
class A{
    public B b;//组合,不会产生很大的耦合性
}

简易计算器:

package com.xiaowei9s.lesson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestCal {
    public static void main(String[] args) {
        new MyCal();
    }
}

//计算器
class MyCal extends Frame{
    public MyCal(){
        //文本框
        TextField tf1 = new TextField(10);
        TextField tf2 = new TextField(10);
        TextField tf3 = new TextField(13);
        //标签
        Label label = new Label("+");
        //按钮
        Button button = new Button("=");
        button.addActionListener(new MyCalActionListener(tf1,tf2,tf3));

        setLayout(new FlowLayout());
        add(tf1);
        add(label);
        add(tf2);
        add(button);
        add(tf3);
        pack();
        setVisible(true);


    }

}

//监听器
class MyCalActionListener implements ActionListener{
    private TextField tf1,tf2,tf3;

    public MyCalActionListener(TextField tf1,TextField tf2,TextField tf3) {
        this.tf1 = tf1;
        this.tf2 = tf2;
        this.tf3 = tf3;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        int n1 = Integer.parseInt(tf1.getText());
        int n2 = Integer.parseInt(tf2.getText());

        tf3.setText(""+(n1 + n2));
        tf1.setText("");
        tf2.setText("");

    }
}

优化:(完全改造为面向对象)使用组合

package com.xiaowei9s.lesson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestCal {
    public static void main(String[] args) {
        new MyCal().LoadFrame();
    }
}

//计算器
class MyCal extends Frame{
    //属性
    TextField t1,t2,t3;
    
    //方法
    public void LoadFrame(){
        t1 = new TextField(10);
        t2 = new TextField(10);
        t3 = new TextField(10);
        Label label = new Label("+");
        Button button = new Button("=");
        button.addActionListener(new MyCalActionListener(this));

        setLayout(new FlowLayout());
        add(t1);
        add(label);
        add(t2);
        add(button);
        add(t3);
        pack();
        setVisible(true);
    }
    
}

//监听器
class MyCalActionListener implements ActionListener{
    private MyCal cal = null;

    public MyCalActionListener(MyCal cal) {
        this.cal = cal;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        int n1 = Integer.parseInt(cal.t1.getText());
        int n2 = Integer.parseInt(cal.t2.getText());

        cal.t3.setText(""+(n1 + n2));
        cal.t1.setText("");
        cal.t2.setText("");

    }
}

优化:内部类(更好的包装)

package com.xiaowei9s.lesson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestCal {
    public static void main(String[] args) {
        new MyCal().LoadFrame();
    }
}

//计算器
class MyCal extends Frame{
    //属性
    TextField t1,t2,t3;

    //方法
    public void LoadFrame(){
        t1 = new TextField(10);
        t2 = new TextField(10);
        t3 = new TextField(10);
        Label label = new Label("+");
        Button button = new Button("=");
        button.addActionListener(new MyCalActionListener());

        setLayout(new FlowLayout());
        add(t1);
        add(label);
        add(t2);
        add(button);
        add(t3);
        pack();
        setVisible(true);
    }

    //监听器
    //内部类的好处就是能直接访问外部类的成员和方法,降低编码成本
    class MyCalActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {

            int n1 = Integer.parseInt(t1.getText());
            int n2 = Integer.parseInt(t2.getText());

            t3.setText(""+(n1 + n2));
            t1.setText("");
            t2.setText("");

        }
    }

}

7. 画笔paint

package com.xiaowei9s.lesson03;

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,800,600);
        setVisible(true);

    }

    //画笔是一个可以重写在Frame类内的方法
    @Override
    public void paint(Graphics g) {//g:图,在图上作画
        g.setColor(Color.BLUE);
        g.drawOval(100,100,100,100);
        g.setColor(Color.RED);
        g.fillOval(150,200,200,200);
        //习惯:还原成画笔最初的颜色:黑
        g.setColor(Color.black);

    }
}

8. 鼠标监听

package com.xiaowei9s.lesson03;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

public class TestMouse01 {
    public static void main(String[] args) {
        new MyPoint().LoadFrame();
    }
}

//自己的类
class MyPoint extends Frame{
    private ArrayList points;


    public void LoadFrame() {
        points = new ArrayList();
        setBounds(200,200,600,600);
        setVisible(true);
        addMouseListener(new MyMouseListener());
    }

    //画笔
    @Override
    public void paint(Graphics g) {
        Iterator iterator = points.iterator();
        while(iterator.hasNext()){
            Point p = (Point) iterator.next();
            g.setColor(Color.cyan);
            g.fillOval(p.x,p.y,10,10);
        }

    }

    //鼠标监听器
    class MyMouseListener extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            Point point = new Point(e.getX(), e.getY());
            points.add(point);
            repaint();
        }
    }
}

9. 窗口监听

package com.xiaowei9s.lesson03;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestWindows {
    public static void main(String[] args) {
        new MyWindowsFrame().LoadFrame();
    }
}

class MyWindowsFrame extends Frame {
    public void LoadFrame(){
        setBackground(Color.cyan);
        setBounds(100,100,200,200);
        setVisible(true);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {//点击左上角关闭的监听事件
                System.out.println("关闭中");
                System.exit(0);
            }

            @Override
            public void windowActivated(WindowEvent e) {//当窗口回到焦点状态时的事件
                System.out.println("被激活");;
            }
        });
    }
}

10. 键盘监听

package com.xiaowei9s.lesson03;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class TestKeyListener {
    public static void main(String[] args) {
        new KeyFrame().LoadFrame();
    }
}

class KeyFrame extends Frame {

    public void LoadFrame() {
        setBounds(100,100,600,400);
        addKeyListener(new MyKeyListener());
        setVisible(true);
    }

    class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            int k = e.getKeyCode();
            System.out.println(k);
            if(k== KeyEvent.VK_W){
                System.out.println("往上走");
            }
            if(k== KeyEvent.VK_S){
                System.out.println("往下走");
            }
            if(k== KeyEvent.VK_A){
                System.out.println("往左走");
            }
            if(k== KeyEvent.VK_D){
                System.out.println("往右走");
            }

        }
    }
}

三、Swing

1. 窗口、面板

package com.xiaowei9s.lesson04;

import javax.swing.*;
import java.awt.*;

public class JFrameDemo {
    public static void main(String[] args) {
        JFrame jf = new JFrame("这是一个JFrame");//顶级窗口
        jf.setBounds(100,100,600,400);
        JLabel lable = new JLabel("这里是JLable");//标签
        lable.setHorizontalAlignment(SwingConstants.CENTER);//设置标签剧中
        jf.add(lable);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭事件
        Container contentPane = jf.getContentPane();
        contentPane.setBackground(Color.cyan);//在顶级窗口下获得顶级窗口容器,改变容器的颜色,而不能直接设置颜色

    }
}

2. 弹窗

package com.xiaowei9s.lesson04;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JDialogDemo extends JFrame {
    public void init(){
        this.setBounds(100,100,600,400);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setLayout(null);//设置绝对布局
        
        JButton button = new JButton("点击弹窗");
        button.setBounds(100,100,200,100);//在绝对布局中设置按钮的相对位置
        button.addActionListener(new ActionListener() {//按钮加入监听
            @Override
            public void actionPerformed(ActionEvent e) {
                new MyDialog();//点击按钮则弹窗
            }
        });
        add(button);
        this.setVisible(true);

    }
    
    public static void main(String[] args) {
        new JDialogDemo().init();//启动

    }

    class MyDialog extends JDialog{//弹窗类
        public MyDialog() {//弹窗初始化
            this.setBounds(200,200,100,100);
            //this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);多余的,不需要也能关
            this.setVisible(true);
            JLabel label = new JLabel("这是一个弹窗");
            add(label);
        }
    }
}

3. 标签

图片标签:

package com.xiaowei9s.lesson04;

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class IconDemo extends JFrame {
    public static void main(String[] args) {
        new IconDemo();
    }

    public IconDemo(){
        JLabel label = new JLabel("这是图片");
        URL url = IconDemo.class.getResource("pic.jpg");//获取图片路径

        label.setIcon(new ImageIcon(url));//图标是标签的子类,放置在lable中
        label.setHorizontalAlignment(SwingConstants.CENTER);
        setBounds(100,100,500,500);
        Container contentPane = getContentPane();
        contentPane.add(label);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

目录结构:

image

4. 面板

package com.xiaowei9s.lesson04;

import javax.swing.*;
import java.awt.*;

public class JPanelDemo extends JFrame {
    public static void main(String[] args) {
        new JPanelDemo();
    }

    public JPanelDemo() {
        Container contentPane = this.getContentPane();
        contentPane.setLayout(new GridLayout(2,1,10,10));//两行一列,间距10

        Panel panel = new Panel(new GridLayout(2, 1, 1, 1));
        Panel panel2 = new Panel(new GridLayout(1, 2, 1, 1));
        Panel panel3 = new Panel(new GridLayout(2, 2, 1, 1));
        Panel panel4 = new Panel(new GridLayout(1, 1, 1, 1));
        panel.add(new JButton("1"));
        panel.add(new JButton("1"));
        panel2.add(new JButton("2"));
        panel2.add(new JButton("2"));
        panel3.add(new JButton("3"));
        panel3.add(new JButton("3"));
        panel3.add(new JButton("3"));
        panel3.add(new JButton("3"));
        panel4.add(new JButton("4"));
        contentPane.add(panel);
        contentPane.add(panel2);
        contentPane.add(panel3);
        contentPane.add(panel4);


        setSize(500,500);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

JScrollPanel:滚动条

package com.xiaowei9s.lesson04;

import javax.swing.*;
import java.awt.*;

public class JScrollDemo extends JFrame {
    public static void main(String[] args) {
        new JScrollDemo();
    }

    public JScrollDemo(){
        //获取容器
        Container contentPane = this.getContentPane();

        //文本域
        JTextArea textArea = new JTextArea(30, 30);

        //面板
        JScrollPane scrollPane = new JScrollPane(textArea);

        //组合起来
        contentPane.add(scrollPane);


        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setBounds(100,100,100,100);
        setVisible(true);
    }
}

5. 按钮

  • 单选按钮

  • package com.xiaowei9s.lesson05;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    public class JButtonDemo02 extends JFrame {
        public static void main(String[] args) {
            new JButtonDemo02();
        }
    
        public JButtonDemo02(){
            Container contentPane = this.getContentPane();
    
            URL resource = JButtonDemo.class.getResource("/pic.jpg");
            ImageIcon imageIcon = new ImageIcon(resource);
    
            JRadioButton btn1 = new JRadioButton("btn1");
            JRadioButton btn2 = new JRadioButton("btn2");
            JRadioButton btn3 = new JRadioButton("btn3");
    
            ButtonGroup buttonGroup = new ButtonGroup();//要分组,单选按钮的唯一性只在组内体现
            buttonGroup.add(btn1);
            buttonGroup.add(btn2);
            buttonGroup.add(btn3);
            
            contentPane.add(btn1,BorderLayout.CENTER);
            contentPane.add(btn2,BorderLayout.NORTH);
            contentPane.add(btn3,BorderLayout.SOUTH);
    
    
            setVisible(true);
            setSize(500,500);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
    
  • 多选按钮

  • package com.xiaowei9s.lesson05;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    public class JButtonDemo03 extends JFrame {
        public static void main(String[] args) {
            new JButtonDemo03();
        }
    
        public JButtonDemo03(){
            Container contentPane = this.getContentPane();
    
            URL resource = JButtonDemo.class.getResource("/pic.jpg");
            ImageIcon imageIcon = new ImageIcon(resource);
    
            JCheckBox box1 = new JCheckBox("box1");
            JCheckBox box2 = new JCheckBox("box2");
            JCheckBox box3 = new JCheckBox("box3");
    
    
    
            contentPane.add(box1,BorderLayout.CENTER);
            contentPane.add(box2,BorderLayout.NORTH);
            contentPane.add(box3,BorderLayout.SOUTH);
    
    
            setVisible(true);
            setSize(500,500);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
    

6. 列表

  • 下拉框

  • package com.xiaowei9s.lesson05;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    public class TestComboDemo extends JFrame {
        public static void main(String[] args) {
            new TestComboDemo();
        }
    
        public TestComboDemo(){
            Container contentPane = this.getContentPane();
    
    
            JComboBox comboBox = new JComboBox();
            comboBox.addItem(null);
            comboBox.addItem("正在热映");
            comboBox.addItem("下架节目");
            comboBox.addItem("预告节目");
    
            contentPane.add(comboBox,BorderLayout.NORTH);
            setVisible(true);
            setSize(500,500);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
    
  • 列表框

  • package com.xiaowei9s.lesson05;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    public class TestComboDemo02 extends JFrame {
        public static void main(String[] args) {
            new TestComboDemo02();
        }
    
        public TestComboDemo02(){
            Container contentPane = this.getContentPane();
    
            String[] strs = {"1","2","3"};
            JList jList = new JList(strs);
    
            contentPane.add(jList,BorderLayout.NORTH);
            setVisible(true);
            setSize(500,500);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
    
  • 应用场景:

    • 选择地区或者单个选项
    • 列表:展示信息,一般动态扩容

7. 文本框

  • 文本框

  • package com.xiaowei9s.lesson06;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    public class TestTextDemo extends JFrame {
        public static void main(String[] args) {
            new TestTextDemo();
        }
    
        public TestTextDemo(){
            Container contentPane = this.getContentPane();
    
            JTextArea textArea = new JTextArea("TextArea");
            JTextField jTextField = new JTextField("JTextField");
    
    
            contentPane.add(textArea,BorderLayout.NORTH);
            contentPane.add(jTextField,BorderLayout.SOUTH);
            setVisible(true);
            setSize(500,500);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
    
  • 密码框

  • package com.xiaowei9s.lesson06;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    public class TestTextDemo01 extends JFrame {
        public static void main(String[] args) {
            new TestTextDemo01();
        }
    
        public TestTextDemo01(){
            Container contentPane = this.getContentPane();
    
            JPasswordField jPasswordField = new JPasswordField();
            jPasswordField.setEchoChar('-');
    
    
            contentPane.add(jPasswordField,BorderLayout.NORTH);
            setVisible(true);
            setSize(500,500);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
    
  • 文本域

  • package com.xiaowei9s.lesson04;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class JScrollDemo extends JFrame {
        public static void main(String[] args) {
            new JScrollDemo();
        }
    
        public JScrollDemo(){
            //获取容器
            Container contentPane = this.getContentPane();
    
            //文本域
            JTextArea textArea = new JTextArea(30, 30);
    
            //面板
            JScrollPane scrollPane = new JScrollPane(textArea);
    
            //组合起来
            contentPane.add(scrollPane);
    
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setBounds(100,100,100,100);
            setVisible(true);
        }
    }
    

四、贪吃蛇

帧:一秒三十帧的意思就是一秒播放三十张画,就能形成动画

键盘监听

定时器Timer


程序入口:

package com.xiaowei9s.snake;

import javax.swing.*;

public class StartGame {
    public static void main(String[] args) {
        JFrame frame = new JFrame("贪吃蛇");

        frame.setBounds(500,200,925,750);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(new GamePanel());
        frame.setVisible(true);
    }
}

图片素材:

package com.xiaowei9s.snake;

import javax.swing.*;
import java.net.URL;

public class Data {
    private static URL headerURL = Data.class.getResource("statics/header.png");
    public static ImageIcon header = new ImageIcon(headerURL);

    private static URL upURL = Data.class.getResource("statics/up.png");
    private static URL downURL = Data.class.getResource("statics/down.png");
    private static URL leftURL = Data.class.getResource("statics/left.png");
    private static URL rightURL = Data.class.getResource("statics/right.png");
    public static ImageIcon up = new ImageIcon(upURL);
    public static ImageIcon down = new ImageIcon(downURL);
    public static ImageIcon left = new ImageIcon(leftURL);
    public static ImageIcon right = new ImageIcon(rightURL);

    private static URL bodyURL = Data.class.getResource("statics/body.png");
    public static ImageIcon body = new ImageIcon(bodyURL);

    private static URL foodURL = Data.class.getResource("statics/food.png");
    public static ImageIcon food = new ImageIcon(foodURL);
}

游戏逻辑:

package com.xiaowei9s.snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

public class GamePanel extends JPanel implements ActionListener {

    //定义蛇的数据结构
    public static ArrayList<Point> snake =null;//蛇身体
    public String fx;//蛇头方向
    public Timer timer = new Timer(100,this);//刷新计时器,监听这个类的发生事件
    public Point food = new Point(0,0);//食物
    public boolean isDefault ;//是否失败
    public int scout;//分数
    //游戏是否开始状态:
    public  boolean isStart = false;


    public GamePanel(){
        init();
    }

    private void init() {
        snake = new ArrayList();
        fx="R";//蛇头向右
        isDefault = false;
        scout = 0;
        food = new Point(0,0);
        snake.add(new Point(100,100));
        snake.add(new Point(75,100));
        snake.add(new Point(50,100));//初始化数据
        this.setFocusable(true);
        this.addKeyListener(new KeyAdapter() {//键盘监听
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                int keyCode = e.getKeyCode();
                switch (keyCode){
                    case KeyEvent.VK_A://左
                        fx = "L";
                        break;
                    case KeyEvent.VK_D://右
                        fx = "R";
                        break;
                    case KeyEvent.VK_W://上
                        fx = "U";
                        break;
                    case KeyEvent.VK_S://下
                        fx = "D";
                        break;
                    case KeyEvent.VK_R://从新来
                        init();
                        break;
                    case KeyEvent.VK_SPACE://空格暂停
                        isStart = !isStart;
                        repaint();
                        break;
                }
                if(isStart) {
                    repaint();//开始游戏就开始刷新画布
                }
            }
        });
        getFood();//获得食物
        timer.start();//频率刷新开始
    }

    private void getFood() {//食物逻辑
        Random random = new Random(System.currentTimeMillis());
        int xr = random.nextInt(33);//850*600
        int yr = random.nextInt(23);//850*600
        int x = 850-(25*xr);
        int y = 600-(25*yr)+50;
        food.x = x;
        food.y = y;

    }
    

    //绘制面板,游戏中所有东西都使用这个画笔来画
    @Override
    protected void paintComponent(Graphics g) {
        this.setBackground(Color.WHITE);//背景
        Data.header.paintIcon(this,g,25,10);//画标题
        g.fillRect(25,75,850,600);//画游戏面板
        if(!isStart){                               //尚未开始时的逻辑
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按下空格开始游戏!",300,300);
        }
        //积分
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,20));
        g.drawString("分数:"+scout,750,50);
        g.setColor(Color.black);

        //画蛇
        Iterator iterator = snake.iterator();
        int count = 0;
        while(iterator.hasNext()){//循环把列表里的点都画出来
            Point next = (Point) iterator.next();
            if(count==0){//第一个是头
                switch (fx){//判断头的方向,使用不同的素材
                    case "R":
                        Data.right.paintIcon(this,g,next.x,next.y);
                        break;
                    case "L":
                        Data.left.paintIcon(this,g,next.x,next.y);
                        break;
                    case "U":
                        Data.up.paintIcon(this,g,next.x,next.y);
                        break;
                    case "D":
                        Data.down.paintIcon(this,g,next.x,next.y);
                        break;
                }
                count++;
                continue;
            }
            Data.body.paintIcon(this,g,next.x,next.y);//其他都是身子
            count++;
        }

        //画食物
        Data.food.paintIcon(this , g , food.x, food.y);

        if (isDefault){//失败逻辑
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑",Font.BOLD,100));
            g.drawString("菜!!",350,350);
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            g.drawString("分数:"+scout,450,450);
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            g.drawString("摁R重新开始",450,550);
        }

    }

    //事件监听器,每次计时器的出发监听器就是这个
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart){
            Point p = snake.get(0);
            Point pre = new Point(p.x,p.y);
            //头的移动逻辑,根据方向判断
            switch (fx){
                case "U":
                    p.y -= 25;
                    if(p.y < 75){
                        p.y = 625;
                    }
                    break;
                case "D":
                    p.y += 25;
                    if(p.y > 650){
                        p.y = 100;
                    }
                    break;
                case "R":
                    p.x += 25;
                    if(p.x > 875){
                        p.x = 25;
                    }
                    break;
                case "L":
                    p.x -= 25;
                    if(p.x<25){
                        p.x = 850;
                    }
                    break;
            }
            Iterator<Point> iterator = snake.iterator();
            iterator.next();
            Point temp = new Point(0, 0);//临时使用点
            Point old = new Point(0, 0);//获得最后一个身体的位置,以防迟到了食物需要加上
            while(iterator.hasNext()){
                Point now = iterator.next();
                temp.x = now.x;
                temp.y = now.y;
                now.x = pre.x;
                now.y = pre.y;
                pre.x = temp.x;
                pre.y = temp.y;
                old.x = now.x;
                old.y = now.y;
            }
            Iterator<Point> iterator1 = snake.iterator();
            int count = 0;
            for (Point point : snake) {//查询是否碰到自己了
                if(point.equals(snake.get(0))&&count!=0){//触碰逻辑
                    isDefault = true;
                    timer.stop();
                    repaint();
                    return;
                }
                count++;
            }

            if (snake.get(0).equals(food)){     //吃到了食物
                scout+=2;
                snake.add(old);
                getFood();
            }

            repaint();//每次出发重画画布
        }
        timer.start();
    }
}

项目结构:

image

素材:https://www.52pojie.cn/thread-1319910-1-1.html

知识来源 kuangstudy.com

posted @ 2021-10-10 18:57  小阴辨  阅读(49)  评论(0)    收藏  举报