Java GUI编程

GUI编程

1、简介

GUI的核心技术:Swing AWT

1、因为界面不美观

2、需要jre环境

为什么要学习?

1、可以写出自己心中想要的一些小工具

2、工作中,也可能需要维护到swing界面,

3、了解MVC架构,了解监听!

 

2、AWT

  1. AWT介绍

    包含了很多类和接口!GUI:图形界面编程

    元素:窗口,按钮,文本框

    image-20220915085620398

    2、组件和容器

    1. Frame

      public static void main(String[] args) {
            //Frame ,JDK
            Frame frame = new Frame("wx-Java图形界面窗口");

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

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

            //设置背景颜色
            frame.setBackground(Color.LIGHT_GRAY);

            //设置窗口弹出初始位置
            frame.setLocation(300,300);

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

            //

        }

       

    2. 面板Panel

      public static void main(String[] args) {
            Frame frame = new Frame();
            //布局的概念
            Panel panel = new Panel();

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

            //坐标
            frame.setBounds(300,300,600,600);
            frame.setBackground(Color.CYAN);

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

            //frame.add(panel)
            frame.add(panel);

            frame.setVisible(true);

            //监听事件,监听窗口关闭事件 system.exit(0)
            //适配器模式:
            frame.addWindowListener(new WindowAdapter() {
                //窗口点击关系的时候需要做的事情
                @Override
                public void windowClosing(WindowEvent e) {
                    //结束程序
                    System.exit(0);
                }
            });

        }

       

    3. 布局管理器

    4.  

      • 流式布局

        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.setLayout(new FlowLayout(FlowLayout.RIGHT));

              frame.setBounds(300,300,600,600);

              frame.setVisible(true);

              //把按钮添加上去
              frame.add(button1);
              frame.add(button2);
              frame.add(button3);
          }

         

      • 东西南北中

        public static void main(String[] args) {
              Frame frame = new Frame("wx");

              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.setBounds(300,300,600,600);
              frame.setVisible(true);
          }

         

      • 表格式 Grid

         public static void main(String[] args) {
              Frame frame = new Frame("wx");

              Button button1 = new Button("East");
              Button button2 = new Button("West");
              Button button3 = new Button("South");
              Button button4 = new Button("North");
              Button button5 = new Button("Center");
              Button button6 = new Button("Center1");

              frame.setLayout(new GridLayout(3,2));

              frame.add(button1);
              frame.add(button2);
              frame.add(button3);
              frame.add(button4);
              frame.add(button5);
              frame.add(button6);

              frame.pack();//Java 函数
              frame.setBounds(300,300,600,600);
              frame.setVisible(true);
          }

         

      练习:

      image-20220915100022948

       

      public static void main(String[] args) {
            //总 frame
            Frame frame = new Frame("wx");
            frame.setVisible(true);
            frame.setLayout(new GridLayout(2,1));
            frame.setBounds(300,300,800,800);


            //4个面板
            Panel panel1 = new Panel(new BorderLayout());
            Panel panel2 = new Panel(new GridLayout(2,1));
            Panel panel3 = new Panel(new BorderLayout());
            Panel panel4 = new Panel(new GridLayout(2,2));

            panel1.add(new Button("East-1"),BorderLayout.EAST);
            panel1.add(new Button("Wast-1"),BorderLayout.WEST);
            panel2.add(new Button("p2-btn-1"));
            panel2.add(new Button("p2-btn-2"));
            panel1.add(panel2,BorderLayout.CENTER);

            panel3.add(new Button("East-2"),BorderLayout.EAST);
            panel3.add(new Button("Wast-2"),BorderLayout.WEST);
            panel4.add(new Button("p4-btn-1"));
            panel4.add(new Button("p4-btn-2"));
            panel4.add(new Button("p4-btn-3"));
            panel4.add(new Button("p4-btn-4"));
            panel3.add(panel4,BorderLayout.CENTER);

            frame.add(panel1);
            frame.add(panel3);

            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });

        }

    总结:

    1. Frame是一个顶级窗口

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

    3. 布局管理器

      1. 流式

      2. 东西南北中

      3. 表格

    4. 大小,定位,背景颜色,监听

  2. 事件

    多个按钮共用一个事件

    public static void main(String[] args) {
          Frame frame = new Frame("wx");

          Button button1 = new Button("start");
          Button button2 = new Button("stop");

          MyMonitor myMonitor = new MyMonitor();
          button1.addActionListener(myMonitor);
          button2.addActionListener(myMonitor);

          //可以显示的定义出发会返回的命令
          button1.setActionCommand("1");
          button2.setActionCommand("2");


          frame.add(button1,BorderLayout.WEST);
          frame.add(button2,BorderLayout.EAST);

          frame.pack();
          windowClose(frame);
          frame.setVisible(true);

          frame.setBounds(300,300,600,600);
      }

      //关闭窗体的事件
      private static void windowClose(Frame frame){
          frame.addWindowListener(new WindowAdapter() {
              @Override
              public void windowClosing(WindowEvent e) {
                  System.exit(0);
              }
          });
      }
       
    public class MyMonitor  implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
          String actionCommand = e.getActionCommand();
          if (actionCommand.equals("1")){
              System.out.println("开始。。。。");
          }else {
              System.out.println("结束。。。。");
          }
      }
    }

     

  3. 输入框TestField

     

  4. 简易计算器

    //简易计算器
    public class TestCalc {

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

    //计算器类
    class Calculation extends Frame {
    //属性
    TextField num1,num2,num3;

    //方法
    public void loadFrame(){
    //三个文本框
    //10为字符数
    num1 = new TextField(10);
    num2 = new TextField(10);
    num3 = new TextField(20);

    //一个按钮
    Button button = new Button("=");

    // MyCalcListner myCalcListner = new MyCalcListner(textField1,textField2,textField3);
    MyCalcListner myCalcListner = new MyCalcListner(this);
    button.addActionListener(myCalcListner);
    //一个标签
    Label label = new Label("+");

    setLayout(new FlowLayout());

    add(num1);
    add(label);
    add(num2);
    add(button);
    add(num3);




    // pack();
    setVisible(true);
    setBounds(300,300,600,600);
    addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    public Calculation() throws HeadlessException {


    }
    }

    //监听器类
    class MyCalcListner implements ActionListener{

    //获取三个变量
    private TextField num1,num2,num3;

    //获取计算器这个对象
    Calculation calculation = null;


    public MyCalcListner(TextField num1, TextField num2, TextField num3) {
    this.num1 = num1;
    this.num2 = num2;
    this.num3 = num3;
    }

    public MyCalcListner(Calculation calculation) {
    this.calculation = calculation;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    //第一种
    /*//1.获得加数和被加数
    Integer num1Text = Integer.parseInt(num1.getText());
    Integer num2Text = Integer.parseInt(num2.getText());

    //2.将这个值加法运算后放到第三个框
    num3.setText(""+(num1Text+num2Text));

    //3.清除前两框
    num1.setText("");
    num2.setText("");*/



    //第二种
    //1.获得加数和被加数
    int n1 = Integer.parseInt(calculation.num1.getText());
    int n2 = Integer.parseInt(calculation.num2.getText());

    //2.将这个值加法运算后放到第三个框
    calculation.num3.setText(""+(n1+n2));

    //3.清除前两框
    calculation.num1.setText("");
    calculation.num2.setText("");
    }
    }

     

  5. 画笔

    //画笔
    public class TestPaint {

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

    class MyPaint extends Frame{

    public void loadFrame(){
    setBounds(300,300,600,400);
    setVisible(true);
    addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }

    //画笔
    @Override
    public void paint(Graphics g){
    //画笔,需要有颜色,可以画画
    g.setColor(Color.GREEN);
    //空心的圆形
    g.drawOval(100,100,50,50);
    //实心的矩形
    g.fillRect(200,200,60,60);

    //养成习惯,画笔画完,将他还原成最初的颜色


    }
    }

     

  6. 鼠标监听

    目的:实现鼠标画画

    image-20220915112934359

     

    //鼠标监听事件
    public class TestMouseListner {

    public static void main(String[] args) {
    new MyFrame("wx");
    }
    }

    //
    class MyFrame extends Frame{
    //画画需要画笔,需要监听鼠标当前的位置,需要集合来存储这个点
    ArrayList points;

    public MyFrame(String title){
    super(title);
    setBounds(300,300,600,600);
    points = new ArrayList();
    //存鼠标点击的点

    //添加鼠标监听器
    this.addMouseListener(new MyMouseListner());

    setVisible(true);
    }

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

    }

    //添加一个点到界面上
    public void addPoint(Point point){
    points.add(point);
    }

    //适配器模式
    private class MyMouseListner extends MouseAdapter {
    //鼠标 按下,弹起,按下不放
    @Override
    public void mousePressed(MouseEvent e) {
    MyFrame myFrame = (MyFrame) e.getSource();
    //点击的时候会产生一个点
    //这个点就是鼠标的点
    myFrame.addPoint( new Point(e.getX(),e.getY()));

    //每次点击鼠标都需要重新画一遍
    myFrame.repaint();
    }
    }
    }

     

  7. 窗口监听

    public class TestWindow {

    public static void main(String[] args) {

    new WindowFrame();
    }
    }

    class WindowFrame extends Frame{

    public WindowFrame(){
    setBackground(Color.GREEN);
    setVisible(true);
    setBounds(300,300,600,600);

    addWindowListener(new WindowAdapter() {

    //关闭窗口
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }

    @Override
    public void windowOpened(WindowEvent e) {
    System.out.println("windowOpened");
    }

    @Override
    public void windowClosed(WindowEvent e) {
    System.out.println("windowClosed");
    }

    //激活窗口
    @Override
    public void windowActivated(WindowEvent e) {
    System.out.println("windowActivated");
    }

    });
    }

    }

     

  8. 键盘监听

    public class TestKeyListener {

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

    class KeyFrame extends Frame{

    public KeyFrame() {
    setVisible(true);
    setBounds(300,300,600,600);
    addKeyListener(new KeyAdapter() {
    //键盘按下
    @Override
    public void keyPressed(KeyEvent e) {
    //获得键盘按下的是哪一个
    //获得当前键盘的码
    System.out.println(e.getKeyCode());
    int keyCode = e.getKeyCode();
    if (keyCode == KeyEvent.VK_UP) {
    System.out.println("你按下了上键");
    }
    //根据按下不同的操作,产生不同的结果
    }
    });
    }
    }

 

 

3、SWING

3.1窗口、面板

public class JFrameDemo1 {

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

}

class MyJFrame extends JFrame{

public void init(){
//获得一个容器
Container contentPane = this.getContentPane();
contentPane.setBackground(Color.GREEN);
setVisible(true);
setBounds(300,300,600,600);

//设置文字
JLabel jLabel = new JLabel("你好");
add(jLabel);

//文字居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);

//关闭事件
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}
}

 

3.2弹窗

JDialog,默认有关闭事件

public class DialogDemo extends JFrame {

public DialogDemo(){
setVisible(true);
setBounds(300,300,600,600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

//JFrame 放东西
Container contentPane = getContentPane();
//绝对布局
contentPane.setLayout(null);

//按钮
JButton jButton = new JButton("点击弹出对话框");
jButton.setBounds(30,30,200,50);

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

add(jButton);



}

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

//弹窗的窗口
class MyDialogDemo extends JDialog{

public MyDialogDemo() {
setVisible(true);
setBounds(400,400,500,500);

Container contentPane = getContentPane();
contentPane.setLayout(null);

contentPane.add(new Label("你好Java"));
}
}

3.3标签

label

new JLabel("xxx");

Icon图标

public class ImageIconDemo extends JFrame {

public ImageIconDemo() throws HeadlessException {
//获取图片的地址
JLabel label = new JLabel("ImageIcon");
URL url = ImageIconDemo.class.getResource("huowa.jpg");

ImageIcon imageIcon = new ImageIcon(url);
label.setIcon(imageIcon);

Container contentPane = getContentPane();
contentPane.add(label);
setVisible(true);
setBounds(300,300,600,600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}

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

图片

//图标,是一个接口,需要实现类,Frame需要继承
public class IconDemo extends JFrame implements Icon {

private int windth;
private int height;

public IconDemo(){

}

public IconDemo(int windth, int height){
this.windth = windth;
this.height = height;
}

public void init(){
IconDemo iconDemo = new IconDemo(30, 30);
//图标放在标签上,也可以放在按钮上
JLabel jlable = new JLabel("iconTest", iconDemo, SwingConstants.CENTER);
Container contentPane = getContentPane();
contentPane.add(jlable);
setVisible(true);
setBounds(300,300,600,600);
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,windth,height);
}

@Override
public int getIconWidth() {
return this.windth;
}

@Override
public int getIconHeight() {
return this.height;
}
}

 

3.4面板

public class JPanelDemo extends JFrame {

public JPanelDemo() throws HeadlessException {
Container contentPane = getContentPane();
//后边参数是间距
contentPane.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,1));
JPanel jPanel4 = new JPanel(new GridLayout(3,2));
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));

jPanel2.add(new JButton("2"));
jPanel2.add(new JButton("2"));

jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));

jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
setBounds(300,300,600,600);
contentPane.add(jPanel1);
contentPane.add(jPanel2);
contentPane.add(jPanel3);
contentPane.add(jPanel4);
}

public static void main(String[] args) {

new JPanelDemo();
}
}

 

JScrollPanel

public class JScrollDemo extends JFrame {
public JScrollDemo() throws HeadlessException {
Container contentPane = getContentPane();

//文本域
JTextArea jTextArea = new JTextArea(20,30);
jTextArea.setText("您好");


//Scroll面板
JScrollPane jScrollPane = new JScrollPane(jTextArea);

contentPane.add(jScrollPane);

setVisible(true);
setBounds(300,300,600,600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}

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

 

3.5按钮

public class JButtonDemo1 extends JFrame {

public JButtonDemo1() throws HeadlessException {
Container contentPane = getContentPane();
//将一个图片变一个图标
URL url = JButtonDemo1.class.getResource("huowa.jpg");
ImageIcon imageIcon = new ImageIcon(url);

//把这个图标放在按钮上
JButton jButton = new JButton();
jButton.setIcon(imageIcon);
jButton.setToolTipText("喷火娃");
contentPane.add(jButton);

setVisible(true);
setBounds(300,300,600,600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


}

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

 

  • 单选按钮

    public class JButtonDemo2 extends JFrame {

    public JButtonDemo2() throws HeadlessException {
    Container contentPane = getContentPane();
    //单选框
    JRadioButton jRadioButton1 = new JRadioButton("jRadioButton1");
    JRadioButton jRadioButton2 = new JRadioButton("jRadioButton2");
    JRadioButton jRadioButton3 = new JRadioButton("jRadioButton3");

    //单选框只能选择一个,分组,一个组中只能同时选择一个
    ButtonGroup buttonGroup = new ButtonGroup();
    buttonGroup.add(jRadioButton1);
    buttonGroup.add(jRadioButton2);
    buttonGroup.add(jRadioButton3);

    contentPane.add(jRadioButton1,BorderLayout.EAST);
    contentPane.add(jRadioButton2,BorderLayout.WEST);
    contentPane.add(jRadioButton3,BorderLayout.NORTH);
    setVisible(true);
    setBounds(300,300,600,600);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


    }

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

     

  • 复选按钮

    //复选按钮
    public class JButtonDemo3 extends JFrame {

    public JButtonDemo3() throws HeadlessException {
    Container contentPane = getContentPane();

    //多选框
    JCheckBox jCheckBox1 = new JCheckBox("jCheckBox1");
    JCheckBox jCheckBox2 = new JCheckBox("jCheckBox2");
    JCheckBox jCheckBox3 = new JCheckBox("jCheckBox3");


    contentPane.add(jCheckBox1,BorderLayout.EAST);
    contentPane.add(jCheckBox2,BorderLayout.WEST);
    contentPane.add(jCheckBox3,BorderLayout.NORTH);

    setVisible(true);
    setBounds(300,300,600,600);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


    }

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

     

 

3.6列表

  • 下拉框

    //下拉框
    public class TestComboxDemo1 extends JFrame {

    public TestComboxDemo1() throws HeadlessException {

    Container contentPane = getContentPane();

    JComboBox jComboBox = new JComboBox();
    jComboBox.addItem("第一项");
    jComboBox.addItem("第二项");
    jComboBox.addItem("第三项");

    contentPane.add(jComboBox);

    setVisible(true);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setBounds(300,300,600,600);

    }

    public static void main(String[] args) {

    new TestComboxDemo1();

    }
    }

     

  • 列表框

    //列表框
    public class TestComboxDemo2 extends JFrame {

    public TestComboxDemo2() throws HeadlessException {

    Container contentPane = getContentPane();

    Vector vector = new Vector();
    vector.add("第一项");
    vector.add("第二项");
    vector.add("第三项");
    //生成列表的内容
    String[] contents = {"1","2","3"};
    JList jList = new JList(vector);

    contentPane.add(jList);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setBounds(300,300,600,600);



    }

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

     

  • 应用场景

    • 选择地区,或者一些单个选项

    • 列表,展示信息,一般是动态扩容

3.7文本框

  • 文本框

    public class TestTxtDemo1 extends JFrame {

    public TestTxtDemo1() throws HeadlessException {
    Container contentPane = getContentPane();

    JTextField jTextField1 = new JTextField("Hello");
    JTextField jTextField2 = new JTextField("Word",20);


    contentPane.add(jTextField1,BorderLayout.SOUTH);
    contentPane.add(jTextField2,BorderLayout.NORTH);

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

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

     

  • 密码框

    public class TestTxtDemo2 extends JFrame {

    public TestTxtDemo2() throws HeadlessException {
    Container contentPane = getContentPane();

    JPasswordField jPasswordField = new JPasswordField();
    jPasswordField.setEchoChar('*');
    contentPane.add(jPasswordField);

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

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

     

  • 文本域

    public class JScrollDemo extends JFrame {
    public JScrollDemo() throws HeadlessException {
    Container contentPane = getContentPane();

    //文本域
    JTextArea jTextArea = new JTextArea(20,30);
    jTextArea.setText("您好");


    //Scroll面板
    JScrollPane jScrollPane = new JScrollPane(jTextArea);

    contentPane.add(jScrollPane);

    setVisible(true);
    setBounds(300,300,600,600);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

     

 

贪吃蛇

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

键盘监听

定时器Timer

 

  1. 定义数据

  2. 画上去

  3. 监听事件

    键盘

    事件

按下空格不好用的话需要按下tab键将焦点切换至窗口

image-20220916095922528

 

 

 

posted on 2022-11-22 11:12  太阳当空照```  阅读(42)  评论(0)    收藏  举报

导航