GUI的学习理解

GUI

1. 简介

GUI的核心技术:Swing 、AWT(抽象的窗口工具)

2.AWT

  • AWT包含了很多的类和接口

  • 元素:窗口、按钮、文本框

  • java.awt包

 

组件和容器

1. Frame

public class TestFrame {
   public static void main(String[] args) {
       Frame frame = new Frame("我的第一个界面");

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

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

       //设置背景
       frame.setBackground(new Color(66, 199, 29));

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

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

效果图:

 

问题:窗口关闭不掉,停止java程序运行即可!

拓展:(编码一个MyFrame类继承于Frame类,可以用较少代码量形成多个窗口)

public class TestFrame02 {
  public static void main(String[] args) {
      //展示多个窗口
      MyFrame myFrame01 = new MyFrame(100, 100, 200, 200, Color.blue);
      MyFrame myFrame02 = new MyFrame(300, 100, 200, 200, Color.pink);
      MyFrame myFrame03 = new MyFrame(100, 300, 200, 200, Color.red);
      MyFrame myFrame04 = new MyFrame(300, 300, 200, 200, Color.green);
  }
}

class MyFrame extends Frame{
  //设置好id,方便窗口的记录
  static int id = 0;
  public MyFrame(int x,int y,int w,int h,Color color){
      //由于是继承了父类,故不需要创建一个新的类.来实现方法
      super("MyFrame+"+(++id));
      setBounds(x,y,w,h);
      setVisible(true);
      setBackground(color);
      setResizable(false);

  }
}

效果图:

2.面板Panel

package com.ge.lesson01;

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

//Panel可以看作是一个空间,但是不能单独存在
public class TestPanel {
   public static void main(String[] args) {

       //先new一个Frame和一个Panel
       Frame frame = new Frame();
       Panel panel01 = new Panel();

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

       //设置Frame、Panel的位置和颜色
       frame.setBounds(100,100,500,500);
       frame.setBackground(new Color(36, 187, 133));
       panel01.setBounds(150,100,200,200);
       panel01.setBackground(new Color(170, 28, 28));

       //将Panel添加进Frame中
       frame.add(panel01);

       //设置背景Frame的可见性
       frame.setVisible(true);

       //监听事件,监听窗口关闭事件 System.exit(0)
       //适配器模式:
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               //结束程序
               System.exit(0);
          }
      });
  }
}

PS:上面添加了监听器事件,解决了上一个实验中无法关闭窗口的问题。

效果图:

 

3.布局管理器

  • 流式布局

    package com.ge.lesson01;

    import java.awt.*;

    public class TestFlowLayout {
       public static void main(String[] args) {
           Frame frame = new Frame();
           frame.setLayout(new FlowLayout(FlowLayout.LEFT));
           Button button01 = new Button("button1");
           Button button02 = new Button("button2");
           Button button03 = new Button("button3");
           frame.setBounds(100,100,300,300);
           frame.add(button01);
           frame.add(button02);
           frame.add(button03);
           frame.setBackground(new Color(35, 65, 220));
           frame.setVisible(true);
      }
    }

     

  • 东南西北中

package com.ge.lesson01;

import java.awt.*;

public class TestBorderLayout {
   public static void main(String[] args) {
       Frame frame = new Frame("ewsnc");
       Button east = new Button("East");
       Button west = new Button("West");
       Button south = new Button("South");
       Button center = new Button("Center");
       Button north = new Button("North");

       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.setBounds(100,100,500,500);
       frame.setVisible(true);
       //frame.setBackground(new Color(48, 98, 220));
  }
}

 

  • 表格布局

package com.ge.lesson01;

import java.awt.*;

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);
       frame.setSize(500,500);
  }
}

作业:

package com.ge.lesson01;

import java.awt.*;

public class assignment {
   public static void main(String[] args) {
       Frame frame = new Frame();
       frame.setVisible(true);
       frame.setBounds(100,100,400,300);
       frame.setLayout(new GridLayout(2,1));
       Panel panel01 = new Panel(new BorderLayout());
       Panel panel02 = new Panel(new GridLayout(2,1));
       Panel panel03 = new Panel(new BorderLayout());
       Panel panel04 = new Panel(new GridLayout(2,2));
       panel01.add(new Button("btn01"),BorderLayout.WEST);
       panel01.add(new Button("btn02"),BorderLayout.EAST);
       panel01.add(panel02,BorderLayout.CENTER);
       panel02.add((new Button("btn03")));
       panel02.add((new Button("btn04")));
       panel03.add(new Button("btn05"),BorderLayout.WEST);
       panel03.add(new Button("btn06"),BorderLayout.EAST);
       panel03.add(panel04,BorderLayout.CENTER);
       panel04.add((new Button("btn07")));
       panel04.add((new Button("btn08")));
       panel04.add((new Button("btn09")));
       panel04.add((new Button("btn010")));
       frame.add(panel01);
       frame.add(panel03);

  }
}

PS:在面板04中其实完全可以用for循环的,上边这样写有一些冗杂。

总结

  1. Frame是一个顶级窗口

  2. Panel无法单独显示,必须添加到某个容器中。

  3. 布局管理器

    1. 流失布局

    2. 东西南北中布局

    3. 表格布局

  4. 大小、定位、背景颜色、可见性、监听

4.事件监听

当某个事情发生的时候,干什么?

package com.ge.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 TestActionEvent {
   public static void main(String[] args) {
       Frame frame = new Frame("按钮实验");
       Button button = new Button("btn01");
       button.addActionListener(new MyActionListener());
       frame.setVisible(true);
       frame.setBounds(100,100,400,400);
       frame.add(button);
       CloseWindow(frame);
  }
   private static void closeWindow(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("abc");
  }
}


 

下面为多个按钮共享一个监听器(事件):

package com.ge.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 TestActionEvent02 {
   public static void main(String[] args) {
       //两个按钮实现同一个监听
       Frame frame = new Frame("按钮实验02");
       Button button01 = new Button("btn01");
       Button button02 = new Button("btn02");
       frame.setVisible(true);
       frame.setBounds(100,100,400,300);
       frame.setLayout(new GridLayout(2,1));

       //有了下面两行的定义,事件发生后e中的值为所编辑的内容(如aileaile),否则为按钮的名字,(如btn01)
       button02.setActionCommand("aileaile");
       button01.setActionCommand("爱了爱了");
       frame.add(button01);
       frame.add(button02);
       button01.addActionListener(new MyActionListener1());
       button02.addActionListener(new MyActionListener1());
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
  }
}

class MyActionListener1 implements ActionListener{

   @Override
   public void actionPerformed(ActionEvent e) {
       System.out.println("判断是否为同一效果=>"+e.getActionCommand());

  }
}

5.输入框TextFiled监听

package com.ge.lesson02;

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

public class TestText01 {
   public static void main(String[] args) {
       //启动!
       MyFrame myFrame = new MyFrame();
  }
}

class MyFrame extends Frame{
   public MyFrame(){
       TextField textField = new TextField();
       add(textField);
       //监听这个文本框输入的文字,接下来按下Enter,就会触发这个输入框的事件
       textField.addActionListener(new MyActionListener2());
       //设置替换编码
       textField.setEchoChar('*');
       setVisible(true);
       pack();
  }
}

class MyActionListener2 implements ActionListener{

   @Override
   public void actionPerformed(ActionEvent e) {
       TextField filed = (TextField) e.getSource();//获得一些资源
       System.out.println(filed.getText());//获得输入框的文本
       filed.setText("");
  }
}

6.简易计算器,组合+内部类回顾复习

oop原则:组合>继承

目前代码:

package com.ge.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 TestCalc {
   public static void main(String[] args) {
   new Calc();
  }
}

//计算器
class Calc extends Frame{
   public Calc(){
       //3个文本框
       TextField num01 = new TextField(10);
       TextField num02 = new TextField(10);
       TextField num03 = new TextField(20);
       //1个按钮
       Button button = new Button("=");
       //1个标签
       Label label = new Label("+");


       setBounds(100,100,500,80);
//       pack();
       setLayout(new FlowLayout());
       add(num01);
       add(label);
       add(num02);
       add(button);
       add(num03);
       //当按了“=”按钮时,监听器行动
       button.addActionListener(new MyCalcLestion(num01,num02,num03));
       setVisible(true);
       new CloseWindow(this);

  }
}



//监听器
class MyCalcLestion implements ActionListener{
   private TextField num1,num2,num3;
   public MyCalcLestion(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(""+(n1+n2));
       //3.清除前两个框
       num1.setText("");
       num2.setText("");
  }
}

//关闭功能
class CloseWindow {
   public CloseWindow(Frame frame){
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
  }
}

 

完全改造为面向对象后:

package com.ge.lesson02;

import javax.xml.soap.Text;
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 TestCalc {
   public static void main(String[] args) {
       new Calc().loadFrame();
  }
}

//计算器
class Calc extends Frame {

   //属性
   TextField num01, num02, num03;

   //方法
   public void loadFrame(){
       //3个文本框
       num01 = new TextField(10);
       num02 = new TextField(10);
       num03 = new TextField(20);
       //1个按钮
       Button button = new Button("=");
       //1个标签
       Label label = new Label("+");


       setBounds(100, 100, 500, 80);
//       pack();
       setLayout(new FlowLayout());
       add(num01);
       add(label);
       add(num02);
       add(button);
       add(num03);
       //当按了“=”按钮时,监听器行动
       button.addActionListener(new MyCalcLestion(this));
       setVisible(true);
       new CloseWindow(this);
  }
}


//监听器
class MyCalcLestion implements ActionListener {
   //获取计算器这个对象,在一个类中组合另外一个类;
   Calc calc = null;

   public MyCalcLestion(Calc calc) {
       this.calc = calc;
  }

   @Override
   public void actionPerformed(ActionEvent e) {
       //1.获得加数与被加数
       int n01 = Integer.parseInt(calc.num01.getText());
       int n02 = Integer.parseInt(calc.num02.getText());
       //2.将这个值 + 法运算后,放到第三个框
       calc.num03.setText("" + (n01 + n02));
       //3.清除前两个框
       calc.num01.setText("");
       calc.num02.setText("");
  }
}

//关闭功能
class CloseWindow {
   public CloseWindow(Frame frame) {
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
  }
}

 

  • 内部类

    更好的包装

    package com.ge.lesson02;

    import javax.xml.soap.Text;
    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 TestCalc {
       public static void main(String[] args) {
           new Calc().loadFrame();
      }
    }

    //计算器
    class Calc extends Frame {

       //属性
       TextField num01, num02, num03;

       //方法
       public void loadFrame(){
           //3个文本框
           num01 = new TextField(10);
           num02 = new TextField(10);
           num03 = new TextField(20);
           //1个按钮
           Button button = new Button("=");
           //1个标签
           Label label = new Label("+");


           setBounds(100, 100, 500, 80);
    //       pack();
           setLayout(new FlowLayout());
           add(num01);
           add(label);
           add(num02);
           add(button);
           add(num03);
           //当按了“=”按钮时,监听器行动
           button.addActionListener(new MyCalcLestion());
           setVisible(true);
           new CloseWindow(this);
      }

       //监听器类
       //将监听器类放到Calc类里边,变成了内部类,同时内部类最大的好处,就是可以畅通无阻地访问外部类的属性和方法
       private class MyCalcLestion implements ActionListener {
           @Override
           public void actionPerformed(ActionEvent e) {
               //1.获得加数与被加数
               int n01 = Integer.parseInt(num01.getText());
               int n02 = Integer.parseInt(num02.getText());
               //2.将这个值 + 法运算后,放到第三个框
               num03.setText("" + (n01 + n02));
               //3.清除前两个框
               num01.setText("");
               num02.setText("");
          }
      }
    }


    //关闭功能
    class CloseWindow {
       public CloseWindow(Frame frame) {
           frame.addWindowListener(new WindowAdapter() {
               @Override
               public void windowClosing(WindowEvent e) {
                   System.exit(0);
              }
          });
      }
    }

     

7.画笔

package com.ge.lesson03;

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

public class TestPaint {
   public static void main(String[] args) {
       new MyPaint().loadFrame();
  }
}

class MyPaint extends Frame{

   public void loadFrame(){
       setVisible(true);
       setBounds(100,100,600,500);


       new closeWindows(this);
  }

   //画笔
   @Override
   public void paint(Graphics g) {

       g.setColor(Color.red);
       g.fillOval(100,100,100,100);

       g.setColor(Color.blue);
       g.fillRect(150,200,200,200);
  }
}

//关闭窗口功能
class closeWindows {
   public closeWindows(Frame frame){
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
  }
}

效果图:

 

 

 

8.鼠标监听

目的:想要实现鼠标画画

package com.ge.lesson03;

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

//鼠标监听事件
public class TestMouseListener {
   public static void main(String[] args) {
       new MyFrame("画画");
  }
}

//自己的类
class MyFrame extends Frame{
   //画画需要画笔,监听鼠标当前的位置,需要集合来存储点的位置
   ArrayList points = new ArrayList<>();

   public MyFrame(String title) {
       super(title);
       setBounds(200,200,400,300);
       setVisible(true);
       //存鼠标点击的点
//       ArrayList points = new ArrayList<>();

       //鼠标,监听这个窗口
       this.addMouseListener(new MyMouseListener());
       new closeWindow(this);
  }

   @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);
  }


   //鼠标监听器,采用适配器模式
   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();//刷新
      }
  }

}

//关闭窗口
class closeWindow{
   public closeWindow(Frame frame){
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
  }
}

 

9.窗口监听

package com.ge.lesson03;

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

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

class MyWindows extends Frame {
   public MyWindows(){
       setVisible(true);
       setBounds(100,100,500,500);
       this.addWindowListener(new WindowAdapter() {

           @Override
           public void windowClosing(WindowEvent e) {
               System.out.println("我被关闭啦");
          }

           @Override
           public void windowActivated(WindowEvent e) {
               MyWindows source =(MyWindows) e.getSource();
               source.setTitle("哎哟不错哦!");
               System.out.println("我被激活啦");
          }
      });
  }
}

 

10.键盘监听

package com.ge.lesson03;

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

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

class KeyFrame extends Frame{
   public KeyFrame() {
       super();
       this.setVisible(true);
       this.setBounds(200,200,500,500);
       this.addKeyListener(new KeyAdapter() {
           @Override
           public void keyPressed(KeyEvent e) {
               System.out.println(e.getKeyChar());
               if(e.getKeyCode()==KeyEvent.VK_A){
                   System.out.println("你输入了A");
              }
          }
      });
       this.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
  }
}

 

3.Swing编程

3.1窗口、面板

package com.ge.lesson04;

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

public class JFrameDemo {
   public static void main(String[] args) {
       new MyJFrame().init();
  }
}

class MyJFrame extends  JFrame{
   public void init(){
       this.setVisible(true);
       this.setBounds(200,200,500,500);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
       //获得一个容器
       Container container = this.getContentPane();
       container.setBackground(Color.yellow);
       JLabel jLabel = new JLabel("哎哟不错哦!");
       this.add(jLabel);
       jLabel.setHorizontalAlignment(SwingConstants.CENTER);
  }
}

PS:与AWT没有太大的区别,不过背景颜色是需要容器(Container类)来设置

3.2弹窗

package com.ge.lesson04;

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

//主窗口
public class DialogDemo extends JFrame {

   public DialogDemo() {
       this.setVisible(true);
       this.setBounds(100,100,400,400);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       //JFrame放东西,容器
       Container container = this.getContentPane();

       //绝对布局
       container.setLayout(null);
       
       //按钮,用于弹窗
       JButton jButton = new JButton("弹出一个窗口");
       jButton.setBounds(30,30,200,50);
       container.add(jButton);

       //点击这个按钮的时候,要弹出另一个窗口
       jButton.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent e) {
               //弹窗
               new MyJDialog();
          }
      });
  }

   public static void main(String[] args) {
       new DialogDemo();
  }
}


class MyJDialog extends JDialog{
   public MyJDialog() {
       this.setVisible(true);
       this.setBounds(30,30,400,400);
       Container container = this.getContentPane();
       container.setLayout(null);
       JLabel jLabel = new JLabel("哎哟不错哦!");
       jLabel.setBounds(40,40,100,100);
       container.add(jLabel);
  }
}

 

3.3标签

new JLabel("xxx");

图标(ICON)放入标签中(JLabel)

package com.ge.lesson04;

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

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 jLabel = new JLabel("icontest", iconDemo, SwingConstants.CENTER);

       Container container = this.getContentPane();
       container.add(jLabel);
       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;
  }
}

 

添加图片如下:

package com.ge.lesson04;

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

public class ImageIconDemo extends JFrame {

   public ImageIconDemo(){
       //获取图片的地址
       JLabel jLabel = new JLabel("图片");
       URL url = ImageIconDemo.class.getResource("tx.jpg");

       //真正变成一个图标
       ImageIcon imageIcon = new ImageIcon(url);

       //将图标放进jLabel中
       jLabel.setIcon(imageIcon);

       //居中摆放
       jLabel.setHorizontalAlignment(SwingConstants.CENTER);

       //调出容器并放置好标签jLabel
       Container container = getContentPane();
       container.add(jLabel);

       //常规操作,设置可见性什么的
       setVisible(true);
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
       setBounds(100,100,400,400);
  }

   public static void main(String[] args) {
       new ImageIconDemo();
  }

}

 

 

3.4面板

JPanel

package com.ge.lesson04;

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

public class JPanelDemo extends JFrame {

   public JPanelDemo() {
       //先获取容器,并设计容器的存放方式,这里使用表格
       Container container = this.getContentPane();
       container.setLayout(new GridLayout(2,1,10,10));//后两个数字代表间距

       //设置面板——>设定好行列
       JPanel panel01 = new JPanel(new GridLayout(2,1));
       JPanel panel02 = new JPanel(new GridLayout(1,4));
       JPanel panel03 = new JPanel(new GridLayout(2,2));

       //设置按钮
       JButton button01 = new JButton("1");
       JButton button02 = new JButton("1");
       JButton button03 = new JButton("2");
       JButton button04 = new JButton("2");
       JButton button05 = new JButton("2");
       JButton button06 = new JButton("2");
       JButton button07 = new JButton("3");
       JButton button08 = new JButton("3");
       JButton button09 = new JButton("3");
       JButton button10 = new JButton("3");

       //将按钮装到面板中
       panel01.add(button01);
       panel01.add(button02);
       panel02.add(button03);
       panel02.add(button04);
       panel02.add(button05);
       panel02.add(button06);
       panel03.add(button07);
       panel03.add(button08);
       panel03.add(button09);
       panel03.add(button10);

       //将面板装到容器中
       container.add(panel01);
       container.add(panel02);
       container.add(panel03);

       //常规操作——>设置可见性什么的
       this.setVisible(true);
       this.setSize(500,500);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

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

 

JScrollPanel

package com.ge.lesson04;

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

public class JScrollDemo extends JFrame {

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

       //设置文本“域”
       TextArea textArea = new TextArea(20, 50);
       textArea.setText("哎哟不错哦!");

       //设置JScroll面板(比较特殊的面板),同时将文本域放进括号中
       JScrollPane jScrollPane = new JScrollPane(textArea);//关键点——>在new的语句中就要将文本域放括号中

       //将JScroll面板放到容器中
       container.add(jScrollPane);


       //常规操作
       this.setVisible(true);
       this.setBounds(100,100,300,350);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

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

}

 

 

3.5按钮

图片与按钮的结合

package com.ge.lesson04;

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

public class JButtonDemo01 extends JFrame{

   public JButtonDemo01(){
       Container container = this.getContentPane();
       //获取图片路径
       URL url = JButtonDemo01.class.getResource("tx.jpg");

       //把图片变成图标
       Icon icon = new ImageIcon(url);

       //把这个图标放在按钮上
       JButton jButton = new JButton(icon);

       //按钮提示功能
       jButton.setToolTipText("图片按钮");

       //把按钮放到容器上
       container.add(jButton);

       //常规操作
       this.setVisible(true);
       this.setBounds(100,100,500,500);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

   public static void main(String[] args) {
       new JButtonDemo01();
  }

}

 

单项选择

package com.ge.lesson04;

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

public class JButtonDemo01 extends JFrame{

   public JButtonDemo01(){
       Container container = this.getContentPane();
       
       //单选框——>设置三个JRadioButton
       JRadioButton jRadioButton01 = new JRadioButton("选项01");
       JRadioButton jRadioButton02 = new JRadioButton("选项02");
       JRadioButton jRadioButton03 = new JRadioButton("选项03");

       //将三个选项归为一组
       ButtonGroup buttonGroup = new ButtonGroup();
       buttonGroup.add(jRadioButton01);
       buttonGroup.add(jRadioButton02);
       buttonGroup.add(jRadioButton03);

       //将三个选项添加进容器中并且布局
       container.add(jRadioButton01,BorderLayout.CENTER);
       container.add(jRadioButton02,BorderLayout.NORTH);
       container.add(jRadioButton03,BorderLayout.SOUTH);

       //常规操作
       this.setVisible(true);
       this.setBounds(100,100,500,500);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

   public static void main(String[] args) {
       new JButtonDemo01();
  }
}

 

多项选择

package com.ge.lesson04;

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

public class JButtonDemo01 extends JFrame{

   public JButtonDemo01(){
       Container container = this.getContentPane();

       //设置两个多选框的选项,用JCheckBox
       JCheckBox jCheckBox01 = new JCheckBox("选择01");
       JCheckBox jCheckBox02 = new JCheckBox("选择02");

       //将这两个选项加入容器中并排好版
       container.add(jCheckBox01,BorderLayout.NORTH);
       container.add(jCheckBox02,BorderLayout.SOUTH);

       //常规操作
       this.setVisible(true);
       this.setBounds(100,100,500,500);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

   public static void main(String[] args) {
       new JButtonDemo01();
  }
}

 

3.6列表

下拉框

package com.ge.lesson04;

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

public class TestComboBoxDemo01 extends JFrame {
   public TestComboBoxDemo01() {
       //获取容器
       Container container = this.getContentPane();

       //设置下拉框JComboBox
       JComboBox jComboBox = new JComboBox();

       //添加几条文案到下拉框
       jComboBox.addItem(null);
       jComboBox.addItem("正在热映");
       jComboBox.addItem("播放中");
       jComboBox.addItem("电影下架");


       //将下拉框添加到容器中
       container.add(jComboBox);


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

   public static void main(String[] args) {
       new TestComboBoxDemo01();
  }
}

 

 

列表框

package com.ge.lesson04;

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

public class TestComboBoxDemo02 extends JFrame{
   public TestComboBoxDemo02() {
       //获取容器
       Container container = this.getContentPane();

       //用数组生成列表的内容
       String[] aaa = {"1","2","3"};

       //创建JList,列表中需要放入内容(数组)
       JList jList = new JList(aaa);

       //将列表放入容器中
       container.add(jList);
       
       this.setVisible(true);
       this.setBounds(100,100,400,400);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

   public static void main(String[] args) {
       new TestComboBoxDemo02();
  }
}
  • 应用场景

    • 下拉框:选择地区或者一些单个选项

    • 列表:展示信息,一般用于动态扩容

3.7文本框

  • 文本框

    TextField

  • 密码框

    package com.ge.lesson04;

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

    public class TestTextDemo01 extends JFrame {
       public TestTextDemo01() {
           //获取容器
           Container container = this.getContentPane();

           //设置密码域JPasswordField,并通过setEchoChar设为默认*
           JPasswordField jPasswordField = new JPasswordField();
           jPasswordField.setEchoChar('*');

           //添加密码域到容器中
           container.add(jPasswordField);

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

       public static void main(String[] args) {
           new TestTextDemo01();
      }
    }

     

  • 文本域

    TextArea,结合Scroll面板使用

 

 

4.贪吃蛇

帧:如果时间片足够小,就是动画,比如一秒30帧和一秒60帧。连起来是动画,拆开就是静态的图片。

键盘监听

事件监听

定时器:Timer

将事件监听与定时器结合起来,然后放到画板中,就可以连贯地更新画面


 

主要思路为

  1. 数据创建

  1. 画图

  1. 监听:

    • 键盘监听

    • 事件监听

 

posted @ 2021-03-10 16:27  Pink_Bird  阅读(76)  评论(0)    收藏  举报