GUI编程学习

# GUI编程(图形界面编程)

GUI的核心技术:swing AWT

但是使用不多,原因:

  1. 界面不美观
  2. 需要jre环境

AWT

AWT包含了很多的类和接口。其包含的元素包括:窗口,按钮,文本框等。其包名为java.awt,包含关系为:

image-20220303203426274

组件和容器

  1. 窗口(Frame)

    用法如下:

    Frame frame = new Frame("newFrame第一个界面窗口");
    
    frame.setVisible(true);//设置窗口可见性
    frame.setSize(400, 400);//设置窗口大小
    frame.setBackground(new Color(11,45,14));//设置背景颜色
    frame.setLocation(200,200);//窗口弹出的初始位置
    frame.setBounds(200,200,400,400);//可直接设置窗口初始位置和大小
    frame.setResizable(false);//设置窗口不能改变(默认为true,可以改变)
    
  2. 面板(Panel)

    面板指一个窗口等容器内的一个面板框,可以称作一个区域

    它和窗口一样可以执行setBounds()方法,setBackground()方法,注意它的坐标创建是相对于它的上级容器的,譬如这里:

    //panel的坐标,是相对于frame的
    frame.setBounds(300,300,500,500);
    frame.setBackground(new Color(11,45,14));
    
    panel.setBounds(50,50,100,100);
    panel.setBackground(new Color(191,98,10));
    
    frame.add(panel);//将面板加入到窗口内
    frame.setVisible(true);//窗口设为可见
    

    得出的结果图为:

    image-20220304162351321

  3. 布局管理器(Layout)

    包含:

    • 流式布局

      public static void flowLayout(){
      
          Frame frame = new Frame();
      
          //组件-按钮
          Button button1 = new Button();
          Button button2 = new Button();
          Button button3 = new Button();
      
          //设置为流式布局
          frame.setLayout(new FlowLayout());
          //frame.setLayout(new FlowLayout(FlowLayout.LEFT)); 左对齐
          //frame.setLayout(new FlowLayout(FlowLayout.RIGHT));    右对齐
      
          //设置为东西南北中
      
      
          frame.setSize(200,200);
          frame.add(button1);
          frame.add(button2);
          frame.add(button3);
      
          frame.setVisible(true);
      }
      
    • 东南西北中

      public static void borderLayout(){
          Frame frame = new Frame();
      
          Button east = new Button();
          Button west = new Button();
          Button north = new Button();
          Button south = new Button();
          Button center = new Button();
      
          frame.setLayout(new BorderLayout());
          //东南西北中
          frame.add(east,BorderLayout.EAST);
          frame.add(west,BorderLayout.WEST);
          frame.add(north,BorderLayout.NORTH);
          frame.add(south,BorderLayout.SOUTH);
          frame.add(center,BorderLayout.CENTER);
      
          frame.setSize(400,400);
          frame.setVisible(true);
      
      }
      
    • 表格布局

      public static void grid(){
          Frame frame = new Frame();
          Button button1 = new Button();
          Button button2 = new Button();
          Button button3 = new Button();
          Button button4 = new Button();
          Button button5 = new Button();
          Button button6 = new Button();
      
          frame.setLayout(new GridLayout(3,2,1,2));//3行,2列,1列距,2行距
          frame.add(button1);
          frame.add(button2);
          frame.add(button3);
          frame.add(button4);
          frame.add(button5);
          frame.add(button6);
      
          frame.pack();//自动设置合适的大小,布局等的函数
          frame.setVisible(true);
      
      }
      
  4. 事件监听。

    监听器用来监听外设操作的各种行为,并作出相应的反应,如点击按钮,输入字符等。

    public class ActionEventListener {
        public static void main(String[] args) {
            Frame frame = new Frame("TEST");
            Button button = new Button("start");
            Listener listener = new Listener();
            button.addActionListener(listener);
            frame.add(button);
            frame.setVisible(true);
        }
    }
    //由于ActionListener是接口,不能直接创建对象
    //所以用一个类实现后创建对象
    
    class Listener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("已开启"+e.getActionCommand());
            System.exit(0);
        }
    }
    

    这里注意getActionCommand()方法,当使用该监听器的构件调用了setActionCommand()方法时,此时getActionCommand()获得的信息为set内的信息,若没有调用则为默认的title信息。

  5. 文本框TextField

    文本框即为一个文本区域,可以在里面键入内容。

    class MyFrame extends Frame{
        public MyFrame(){
            TextField textField = new TextField("输入框");
            Button button = new Button();
            setBounds(300,300,300,300);
    
            textField.addActionListener(new EnterListener());
    
            add(textField);
            add(button);
            setVisible(true);
            pack();
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    class EnterListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("输入内容为:" + e.getActionCommand());
    
        }
    }
    

    以下为我的理解:

    不同的组件,对加入同样的监听器,会产生不同的反应:

    譬如,当创建一个实现类作为监听器实现ActionListener接口时,用不同的构建添加该监听器:

    button.addActionListener(listener);
    textField.addActionListener(listener);
    

    当使用按钮点击时,会输出内容;而用文本框使用回车,也可以输出内容。

    注:相同的组件,对相同监听器,重写的各种监听方法,也会产生不同的反应,因此这些方法之间都是分开的

  6. 画笔Paint

    使用画笔可以在窗口,面板等容器内勾画图像。画笔方法可以直接重写java.awt里面的paint方法,如下:

        //画笔
        @Override
        public void paint(Graphics g) {
            //画笔有颜色
            g.setColor(Color.red);
            //能够画画
            g.drawOval(100,100,100,100);
            g.fillOval(300,300,100,100);//实心的圆
    
            g.setColor(Color.green);
            g.fillRect(150,200,100,100);
    
            //养成习惯,画笔用完还原到最初颜色
            g.setColor(Color.black);
    
        }
    }
    
  7. 鼠标监听

    实现鼠标点击出颜色。

    class MouseFrame extends Frame{
    	//存储每个点的集合
        ArrayList<Point> arrayList = new ArrayList();
        //画画需要画笔
        public MouseFrame(String title){
            setVisible(true);
            setBounds(200,200,500,500);
            this.addMouseListener(new MyMouseListener());//鼠标监听器
    
        }
    
        @Override
        public void paint(Graphics g) {
            Iterator iterator = arrayList.iterator();
            while (iterator.hasNext()){
                Point p = (Point) iterator.next();
                g.setColor(Color.red);
                g.fillOval(p.x,p.y,10,10);
            }
        }
    
        //适配器模式
    
        private class MyMouseListener extends MouseAdapter{
            //按下,每点击一次出一个点
            @Override
            public void mousePressed(MouseEvent e) {
                MouseFrame frame = (MouseFrame) e.getSource();
                Point point = e.getPoint();
                frame.arrayList.add(point);
                //每次点击鼠标之后都需要重画一次
                frame.repaint();
            }
        }
    }
    
  8. 窗口监听

    该种监听主要监听窗口本身的变化,如关闭窗口,激活窗口等:

    class WindowFrame extends Frame {
        public WindowFrame(String title){
            super(title);
            setVisible(true);
            setBounds(100,100,400,400);
            addWindowListener(new WindowAdapter() {
                //匿名内部类
    
    			//激活
                @Override
                public void windowActivated(WindowEvent e) {
                    System.out.println("active");
                }
    			//关闭
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
  9. 键盘监听

    class KeyFrame extends Frame {
        public KeyFrame(String title){
            super(title);
            setVisible(true);
            setBounds(100,100,500,500);
            addKeyListener(new KeyAdapter() {
                //匿名内部类
                @Override
                public void keyPressed(KeyEvent e) {
                    int keyCode = e.getKeyCode();//获取当前键盘的码,码有专门对应的值。
                    if(keyCode == KeyEvent.VK_UP){
                        System.out.println("上");
                    }
                }
            });
        }
    }
    

Swing(重点)

Swing里面扩展了很多基于awt没有的UI样式,适用范围更广。

1.JFrame窗口

它实质上是继承了awt包里面的Frame类:

public class JFrame  extends Frame implements WindowConstants,
                                              Accessible,
                                              RootPaneContainer,
                              TransferHandler.HasGetTransferHandler

首先是在一般编程时,我们一般会设置init()方法用来初始化容器:

public class JFrameDemo {

    //init();   用作初始化
    public void init(){
        JFrame jf = new JFrame("标题");
        jf.setVisible(true);
        jf.setBounds(100,100,1000,1000);

        JLabel jLabel = new JLabel("hello",JLabel.CENTER);//居中
        jf.add(jLabel);
        jf.getContentPane().setBackground(Color.green);

        //让文本居中
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);
        //关闭事件,这个方法是JFrame默认的注册关闭操作
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//该参数就是指关闭

    }


    public static void main(String[] args) {
        //建立一个窗口
        new JFrameDemo().init();
    }


}

这里看代码有一些要注意的:

  • 让文本JLable水平对齐,有两种方法:初始化时,即在title后加一个参数,CENTER这里就是居中;设置初始化后,调用水平对齐方法setHorizontalAlignment(),CENTER这里指居中。代码里面两个都写了示例。
  • swing的操作比awt高级,有些监听器可以不用自己写,直接调用自带方法,例如这里的关闭操作监听器的注册,调用了setDefaultCloseOperation()方法,他有四个参数,各自对应不同的关闭操作。
  • 要对JFrame窗口,以及之后学的面板,弹窗内颜色进行操作,由于这些都是顶级容器,需要获取他们的内容面板,所以首先需要对这些对象使用getContenePanel()方法,获取他们的容器对象Container;之后再调用setBackground()来设置背景。

2.JDialog弹窗

弹窗的操作与上面说的窗口类似,它继承了awt包下的Dialog类。

这里学习过程中了解到上一个说的Container类的另一个操作,也就是对整体布局,要想操作窗口,弹窗等的布局,也需要获取他们的容器对象Container之后再调用setLayout()方法。

3.标签

与以上也类似,即JLabel:

JLabel jLabel = new JLabel(String title,int num);//num指设置JLabel格式对应的常数数值
JLabel jLabel = new JLabel(String text, Icon icon, int horizontalAlignment);//JLabel内加入图标

该标签对应以上方法即可,均可类比。

标签有两个相关接口:

  1. Icon——图标,需要实现类实现三个方法:getIconWidth,getIconHeight,paintIcon

    之后需要把对应的实现类对象加入到标签对象中:

    public void init(){
        IconLearning icon = new IconLearning(15,15);
        //JLabel内加入了图标,而容器内又加入了JLabel
        JLabel jLabel = new JLabel("label", icon, SwingConstants.CENTER);
        //************
        getContentPane().add(jLabel);
        setVisible(true);
        setBounds(100,100,500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    

    以上加入图标为一个点,内容定义到paintIcon方法中了,这里说明一下。

  2. 问题来了,图标如果是图片怎么办?可以使用imageIcon将标签置为图片图标:

    public void init(){
        //使用imageIcon,即图片标签对象保存图片
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\Administrator\\Pictures");
        //将标签设置为图片标签
        JLabel jLabel = new JLabel("label",SwingConstants.CENTER);
        jLabel.setIcon(imageIcon);
        //*************
        getContentPane().add(jLabel);
        setVisible(true);
        setBounds(100,100,500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    

    也可以套用上面Icon的方法,只是将icon实现类更换为ImageIcon即可:

    public void init(){
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\Administrator\\Pictures\\result.png");
        //JLabel内加入了图标,而容器内又加入了JLabel
        JLabel jLabel = new JLabel("label", imageIcon, SwingConstants.CENTER);
        //*********************
        getContentPane().add(jLabel);
        setVisible(true);
        setBounds(100,100,500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    

4.面板

JPanel与上面的窗口,弹窗类似操作:

public void init(){
    Container container = 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));


    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"));


    container.add(panel1);
    container.add(panel2);

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

JScrollPanel,为滚动面板,可以有滚动条上下滚动

public void init(){
    Container container = getContentPane();

    //文本域
    JTextArea textArea = new JTextArea();
   	textArea.setText("sadaskljdklsajdlajdkjaskjhakxckjascjsbakcabkjcbaksajhsdlasdkll");
    JScrollPane jScrollPane = new JScrollPane(textArea);

    container.add(jScrollPane);

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

}

5.按钮

也就是JButton,按钮上可以加图标,可以加提示等等:

public void init(){
    Container container = getContentPane();
    //图片变图标
    Icon icon = new ImageIcon("C:\\Users\\Administrator\\Pictures\\result.png");

    //把图标加到按钮上
    JButton button = new JButton();
    button.setIcon(icon);
    button.setToolTipText("图片按钮");//提示文本,鼠标移动上去会有提示
    container.add(button);
    
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setVisible(true);
    setBounds(100,100,1000,1000);


}

这里提一下:

单选框

即单选按钮JRadioButton,N个按钮不能同时选择,只能选择一个,采用JButtonGroup将多个单选框组合一起形成一个组,可以进行单选操作:

//单选框
JRadioButton radioButton1 = new JRadioButton("01");
JRadioButton radioButton2 = new JRadioButton("02");
JRadioButton radioButton3 = new JRadioButton("03");

//单选框N个按钮不能同时选择,只能选择一个
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(radioButton1);
buttonGroup.add(radioButton2);
buttonGroup.add(radioButton3);

container.setLayout(new GridLayout(3,1));
container.add(radioButton1);
container.add(radioButton2);
container.add(radioButton3);

复选框

即多选按钮JCheckBox,N个按钮可以同时选择。因为可以多选,所以不需要JButtonGroup组合:

//多选框
JCheckBox jCheckBox01 = new JCheckBox("01");
JCheckBox jCheckBox02 = new JCheckBox("02");
JCheckBox jCheckBox03 = new JCheckBox("03");

container.setLayout(new FlowLayout());
container.add(jCheckBox01);
        container.add(jCheckBox02);
        container.add(jCheckBox03);

6.列表

包括下拉菜单栏,列表框等

  • 下拉菜单栏JComboBox:指点击后出现下拉菜单进行选择,可以添加监听器,这里不多做演示:

    public void init(){
        Container container = getContentPane();
    
        JComboBox comboBox = new JComboBox();
    
        //添加选项
        comboBox.addItem("臭豆腐");
        comboBox.addItem("六舅");
        comboBox.addItem("柠檬");
        comboBox.addItem("奥利给");
    
        container.add(comboBox);
    
        setVisible(true);
        setBounds(100,100,300,300);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    
  • 列表框JList:显示对应的输入内容,比如各种数组

    public void init(){
        Container container = getContentPane();
    
        //生成列表的内容
        String[] str = {"1","2","3"};
        //列表中放入内容
        JList list = new JList(str);
    
        container.add(list);
    
        setVisible(true);
        setBounds(100,100,300,300);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    

7.文本框

  • 文本框JTextField

    public void init(){
        Container container = getContentPane();
    
        //文本框
        JTextField jTextField = new JTextField("text");
        JTextField jTextField1 = new JTextField("TEXT1",20);//后面的参数指文本里面有限制多少字符
    
        container.add(jTextField,BorderLayout.NORTH);
        container.add(jTextField1,BorderLayout.SOUTH);
    
        setVisible(true);
        setBounds(100,100,400,600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
    }
    
  • 密码框JPassWordField

    public void init(){
        Container container = getContentPane();
    
        JPasswordField field = new JPasswordField();
        field.setEchoChar('*');//设置显示的格式
        setVisible(true);
        setBounds(100,100,400,600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
    }
    
  • 文本域JTextArea,之前已经提到过

    JTextArea textArea = new JTextArea();
    textArea.setText("sadaskljdklsajdlajdkjaskjhakxckjascjsbakcabkjcbaksajhsdlasdkll");
    
posted @ 2022-03-14 20:40  可乐加品客  阅读(104)  评论(0编辑  收藏  举报