GUI图形用户界面(Swing窗体)---课堂笔记(附源码)

Swing窗体(JFrame)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小问题

​ 之前学过Awt包,继承Frame类的那个窗体,有个很大的问题是,它不行正常的显示中文在控件上,这就很难受。经过学习,我发现Swing窗体是没有这个问题的,当然也可能是我电脑的问题。

Swing&AWT功能

  • 界面设计
    • 窗体、控件、面板、布局管理
    • 事件处理机制

Swing&AWT区别

  • 两个是图形界面包
  • AWT做图形,使用本地操系统方法,图像界面与本地操作系统一致
  • Swing做图形,使用自己的方法,与平台无关。
  • 使用Swing方式

一、Swing概述

1、完成第一个窗体

  • 使用java.swing包
  • 借用JFrame类
    • 继承
  • 设计窗体
    • 设置窗体大小
    • 设置标题
    • 设置关闭窗体按钮
    • 设置窗体显示
import javax.swing.*;
public class JFrameTextRun {
    public static void main(String[] args) {
        new JFrameText();
    }
}
class JFrameText extends JFrame{
    public JFrameText(){
        init();
    }
    public void init(){
        setTitle("啦啦啦窗口标题");
        setBounds(500,500,400,300);
//        setSize(400,300); //大小 //同上
//        setLocation(500,500);//启动方位
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认的关闭方式
        setVisible(true);//窗口是否可见
    }
}

运行结果

在这里插入图片描述

2、向窗体添加控件

  • 继承窗体
  • 添加自己的控件
    • 做为窗体的成员属性
    • 设置控件的属性

2.1、JTextField方法:

方法 说明
JTextField() 构造新的文本输入框
JTextField(String text) 构造一个新的文本输入框,以指定文本作为初始文本
getColumns() 返回文本字段中的列数
setColumns(int columns) 设置最多可显示内容的列数
setHorizontalAlignment(int value) 设置文本字段中文本的水平对齐方式:JTextField.LEFT
JTextField.CENTER
JTextField.RIGHT
import javax.swing.*;

public class JFrameTextRunA{
    public static void main(String[] args) {
        new JFrameTextA();
    }
}
class JFrameTextA extends JFrame{
    public JFrameTextA(){
        init();
    }
    public void init(){
        setTitle("啦啦啦窗口标题");
        setBounds(500,500,400,300);
//        setSize(400,300); //大小 //同上
//        setLocation(500,500);//启动方位
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认的关闭方式
        setVisible(true);//窗口是否可见
        setResizable(false);
//------------------------------------------------------------------------
//2、向窗体添加控件
// 2.1、JTextField方法:
        JTextField JTF1 = new JTextField();//构造新的文本输入框
        JTextField JTF2 = new JTextField("啦啦啦文本输入框",1);//构造一个新的文本输入框,以指定文本作为初始文本
        JTextField JTF3 = new JTextField(5);
        JTF1.setBounds(20,20,200,50);
        JTF2.setBounds(20,80,200,50);
        JTF3.setBounds(20,140,200,50);
        add(JTF1);
        add(JTF2);
        JTF3.setColumns(6);
        JTF3.setText(String.valueOf(JTF3.getColumns()));//返回文本字段中的列数
        JTF3.setColumns(6);
        JTF3.setHorizontalAlignment(JTF3.RIGHT);//设置对齐方式
        add(JTF3);
    }
}

遗留问题:getColumns()

2.2、JButton方法:

方法 说明
JButton() 创建不带文本和图标的按钮
JButton(Icon icon) 创建带图标的按钮
JButton(String text) 创建带文本的按钮
JButton(String text,Icon icon) 创建带文本和图标的按钮
setRolloverlcon(Icon img) 当鼠标经过时,显示指定的图标
setSelectedlcon(Icon img) 当选择按钮时,显示img指定的图标
import javax.print.attribute.standard.JobName;
import javax.swing.*;
import java.awt.*;

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

    public void init(){
        setTitle("窗口标题");
        setBounds(500,300,500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(false);
        //创建容器
        Container container = this.getContentPane();
        container.setLayout(null);//绝对布局
        ////////////////////////////////////////////////
        //创建不带文本和图标的按钮
        JButton jButton = new JButton();
//        jButton.setText("按钮A");
        jButton.setBounds(0,10,200,50);
        container.add(jButton);
        /////////////////////////////////////////////////
        //创建带图标的按钮
        JButton jButton1 = new JButton(new ImageIcon(".\\icon\\如何养猪.jpg"));
        jButton1.setBounds(0,70,200,200);
        container.add(jButton1);
        /////////////////////////////////////////////////
        //创建带文本的按钮
        JButton jButton2 = new JButton("按钮B,因为A没显示,哈哈哈");
        jButton2.setBounds(0,280,200,50);
        container.add(jButton2);
        /////////////////////////////////////////////////
        //创建带文本和图标的按钮
        JButton jButton3 = new JButton("按钮C"/*当图片不存在时显示*/,
                new ImageIcon(".\\icon\\花瓣.png"));
        jButton3.setBounds(0,340,300,100);
        container.add(jButton3);
        //当鼠标经过时,显示指定的图标setRolloverIcon
        JButton jButton4 = new JButton();
        jButton4.setBounds(210,10,150,200);
        jButton4.setRolloverIcon(new ImageIcon(".\\icon\\淋光.jpg"));
        jButton4.setSelectedIcon(new ImageIcon(".\\icon\\淋光.jpg"));
        container.add(jButton4);
    }
}

遗留问题:setRolloverIcon|setSelectedIcon

2.3、JCheckBox

方法 说明
JCheckBox() 创建初始非选中的复选框,且不带文本或图标
JCheckBox(String text) 用指定的文本创建初始非选中的复选框
JCheckBox(String text,boolean selected) 用指定文本创建一个复选框,并指定是否初始选中该复选框
import javax.swing.*;
import java.awt.*;

public class JCheckBoxText {
    public static void main(String[] args) {
        new JFrameText1();
    }
}
class JFrameText1 extends JFrame {
    public JFrameText1(){
        init();
    }
    public void init(){
        setTitle("窗口标题");
        setVisible(true);
        setBounds(500,300,500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        Container container=this.getContentPane();
        container.setLayout(null);
        /////////////////////////////////////////////
        //创建初始非选中的复选框,且不带文本或图标
        JCheckBox jCheckBox = new JCheckBox();
        jCheckBox.setBounds(0,10,50,50);
        container.add(jCheckBox);
        //////////////////////////////////////////
        //用指定的文本创建初始非选中的复选框
        JCheckBox jCheckBox1 = new JCheckBox("复选框B");
        jCheckBox1.setBounds(0,70,100,50);
        container.add(jCheckBox1);
        ////////////////////////////////////////////
        //用指定文本创建一个复选框,并指定是否初始选中该复选框
        JCheckBox jCheckBox2 = new JCheckBox("复选框C",true);
        jCheckBox2.setBounds(0,130,100,50);
        container.add(jCheckBox2);
    }


}

2.4、JRadioButton

方法 说明
JRadioButton 创建初始非选中的单选按钮,不设置其文本
JRadioButton(String text) 用指定的文本创建非选中的单选按钮
JRadioButton(String text,boolean selected) 用指定的文本和选中状态创建单选按钮
import javax.swing.*;
import java.awt.*;

public class JRadioButtonText {
    public static void main(String[] args) {
        new WindJFrame();
    }
}
class WindJFrame extends JFrame {
    public WindJFrame(){
        init();
    }
    public void init(){
        setTitle("窗口标题");
        setVisible(true);
        setBounds(500,300,500,500);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container container = this.getContentPane();
        container.setLayout(null);
        //////////////////////////////////////////
        //创建初始非选中的单选按钮,不设置其文本
        JRadioButton jRadioButton = new JRadioButton();
        jRadioButton.setBounds(0,10,200,100);
        container.add(jRadioButton);
        //////////////////////////////////////////
        //用指定的文本创建非选中的单选按钮
        JRadioButton jRadioButton1 = new JRadioButton("单选按钮B");
        jRadioButton1.setBounds(0,120,200,100);
        container.add(jRadioButton1);
        ///////////////////////////////////////////
        //用指定的文本和选中状态创建单选按钮
        JRadioButton jRadioButton2 = new JRadioButton("单选按钮C",true);
        jRadioButton2.setBounds(0,230,200,100);
        container.add(jRadioButton2);

    }
}

2.5、JComboBox

方法 说明
JcomboBox() 创建一个下拉框实例
addItem(Object obj) 将项添加至项的列表
getItemAt(int index) 返回指定索引位置的列表项
getItemCount() 返回列表(作为对象)中的项数
getSelectedItem() 将当前选择的项作为一个对象返回
getSelectedIndex() 返回当前选择项的索引位置
import javax.swing.*;
import java.awt.*;

public class JComboBoxText {
    public static void main(String[] args) {
        new WindowJFrame();
    }
}
class WindowJFrame extends JFrame{
    JButton jButton;
    JTextField jTextField1;
    JComboBox jComboBox;
    public WindowJFrame(){
        init();
    }
    public void init(){
        setTitle("窗口标题");
        setVisible(true);
        setBounds(500,300,500,500);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container container=this.getContentPane();
        container.setLayout(null);//设置绝对布局
        //////////////////////////////////////////
        //创建一个下拉框实例
        //将项添加至项的列表addItem(Object obj)
        jComboBox = new JComboBox();
        jComboBox.setBounds(0,10,400,30);
        jComboBox.addItem(new String("1"));
        jComboBox.addItem(new String("2"));
        jComboBox.addItem(new String("4"));
        container.add(jComboBox);
        //返回指定索引位置的列表项getItemAt(int index)
        JTextField jTextField = new JTextField(String.valueOf(jComboBox.getItemAt(2)));
        jTextField.setBounds(0,80,400,30);
        container.add(jTextField);
        //返回列表(作为对象)中的项数getItemCount()
        jTextField1 = new JTextField(String.valueOf(jComboBox.getItemCount()));
        jTextField1.setBounds(0,120,400,30);
        container.add(jTextField1);
        System.out.println(jComboBox.getSelectedItem());
        System.out.println(jComboBox.getSelectedIndex());
    }
}

3、控件共同特性

  • 所有控件都继承Jcomponent类
  • 共同方法
    • setText();
    • getText();
    • setFont(font);
    • setBackground(Color);
    • setBound(x,y,width,length);

4、布局管理

4.1、BorderLayout布局

边界布局管理器,将容器划分为5个部分

  • 不是五个部分都必须添加控件
  • 中间组件会自动的调节大小(中间部分最强势)
  • JFrame,JDialog默认布局管理器就是BorderLayout
方法 说明
BorderLayout 创建新的BorderLayout,组件之间没有间距
setHgap(int hgap) 将组件间的水平间距设置为指定的值
setVgap(int vgap) 将组件间的垂直间距设置为指定的值
import javax.swing.*;
import java.awt.*;

public class BorderLayoutText extends JFrame {
    private JButton jb1,jb2,jb3,jb4,jb5;
    public BorderLayoutText(){
        //创建组件
        jb1=new JButton("中");
        jb2=new JButton("北");
        jb3=new JButton("东");
        jb4=new JButton("南");
        jb5=new JButton("西");
        //添加组件
        add(jb1, BorderLayout.CENTER);
        add(jb2, BorderLayout.NORTH);
        add(jb3, BorderLayout.EAST);
        add(jb4, BorderLayout.SOUTH);
        add(jb5, BorderLayout.WEST);
        //设置窗体属性
        //窗口标题
        setTitle("边界布局案例");
        //设置窗体大小
        setSize(500,500);
        //设置窗体位置
        setLocation(500,300);
//        setBounds(500,300,500,500);
        //设置关闭窗体同时退出JVM
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //显示窗体
        setVisible(true);
        //窗口是否可以拖放大
        setResizable(false);
    }
}
class RunText{
    public static void main(String[] args) {
        new BorderLayoutText();
    }
}

4.2、FlowLayout布局

流布局是面板的默认布局管理器

方法 说明
FlowLayout() 构造新的中间对齐的FlowLayout,将垂直和水平间距保留为5个像素
setAlignment(int align) 设置指定布局的对齐方式
setHgap(int hgap) 设置指定布局的水平间距
setVgap(int vgap) 设置指定布局的垂直间距

特点:

  • 不限制他所管理的组件的大小,允许他们有最佳大小
  • 当容器被缩放时,组件的位置可能发生变化,但是组件的大小不变
  • 默认组件是居中对齐,可以通过FlowLayout(intalign)函数来指定对齐方式
import javax.swing.*;
import java.awt.*;

public class FlowLayoutText extends JFrame {
    public static void main(String[] args) {
        new FlowLayoutText();
    }
    public FlowLayoutText(){
        super();
        setTitle("流布局管理器测试");
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(500,300,200,200);

        Container container = this.getContentPane();//创建容器
        container.setLayout(new FlowLayout(/*FlowLayout.LEFT*/));//设置容器布局
        //创建组件
        final JButton jButton = new JButton("金");
        final JButton jButton1 = new JButton("木");
        final JButton jButton2 = new JButton("水");
        final JButton jButton3 = new JButton("火");
        final JButton jButton4 = new JButton("土");
        //添加组件
        container.add(jButton);
        container.add(jButton1);
        container.add(jButton2);
        container.add(jButton3);
        container.add(jButton4);

        //设置布局管理器,流式布局默认是中间对齐
        //我们要在new FlowLayout(FlowLayout.LEFT)设置,<-此时设置的左对齐

    }


}

4.3、GridLayout布局

网格布局特点

  • 组件的相对位置不会随容器变化,但组件的大小会变
  • 所有组件的大小是相同的
  • 可以通过GridLayout(int rows,int cols,int hgap,int vgap)来指定网格的行/列,水平间隙/垂直间隙
方法 描述
GridLayout() 创建网格布局,默认为每个组件占用一整列和一单行
GridLayout(int rows,int cols) 用指定的行数和列数创建网格布局
GridLayout(int rows,int cols,int hgap,int vgap) 用指定的行数和列数、指定的水平个垂直间距创建网格布局
setColumns(int cols) 将相应的布局中的列数设置为指定值
setHgap(int hgap) 将相应的布局中的水平间距设置为指定值
setVgap(int vgap) 将相应的布局中的垂直间距设置为指定值
setRows(int rows) 将相应布局中的行数设置为指定值
import javax.swing.*;
import java.awt.*;

public class GridLayoutText extends JFrame {
    int size=9;
    private JButton jbs[] = new JButton[size];
    public static void main(String[] args) {
        new GridLayoutText();
    }
    public GridLayoutText(){
        //创建组件
        for (int i = 0; i < size; i++) {
            jbs[i] = new JButton(String.valueOf(i));
        }
        Container container = this.getContentPane();
        //设置网格布局管理器,设置3行3列,每个组件间隔水平方向10,垂直方向10个像素
        container.setLayout(new GridLayout(3,3,10,10));
        //添加组件
        for (int i = 0; i < size; i++) {
            container.add(jbs[i]);
        }
        //设置窗体
        setTitle("网格布局测试");
        setSize(500,500);
        setLocation(500,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

5、事件处理

5.1、动作事件ActionEvent

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionEventText extends JFrame {
    private JLabel label;//标签

    public static void main(String[] args) {
        new ActionEventText();
    }
    public ActionEventText(){
        super();//调用父类方法,详细功能在面向对象一章博客文档
        setTitle("动作事件示例");//标题
        setBounds(100,100,500,375);//大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭方式
        setVisible(true);//窗口是否可见
        setResizable(false);//窗口是否可以自由调整大小
        //以上代码最后一次备注
        ///////////////////////////////////////////////////
        //添加标签
        label = new JLabel("欢迎登录");
//        label.setText("欢迎登录");
        label.setHorizontalAlignment(JLabel.CENTER);//设置对齐方式
        Container container=this.getContentPane();//创建一个容器
        container.add(label);

        //添加按钮
        final JButton jButton = new JButton("登录");
//        jButton.setText("登录");
        jButton.addActionListener(new ButtonActionText());
        container.add(jButton,BorderLayout.SOUTH);
    }
    //按钮监听器
    class ButtonActionText implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            //获得触发此事件的按钮对象
            JButton jButton= (JButton) e.getSource();
            //获取触发此事件的标签文本
            String jButtonName=e.getActionCommand();
            if (jButtonName.equals("登录")){
                label.setText("您已成功登录");//修改标签提示信息
                jButton.setText("退出");//修改按钮提示信息
            }else{
                label.setText("您已安全退出");
                jButton.setText("登录");
            }
        }
    }
}


5.2、FocusEvent焦点事件

import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

public class FocusEventText extends JFrame {
    private JTextField textField;
    public static void main(String[] args) {
        FocusEventText focusEventText = new FocusEventText();
    }
    public FocusEventText(){
        setTitle("焦点事件示例");
        setBounds(100,100,500,375);
        setVisible(true);
        getContentPane().setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JLabel jLabel = new JLabel();//创建标签
        jLabel.setText("出生日期");
        getContentPane().add(jLabel);

        textField = new JTextField();
        textField.setColumns(10);//设置对多可显示内容的列数
        textField.addFocusListener(new TextFocusListener());
        getContentPane().add(textField);

        final JButton jButton = new JButton();
        jButton.setText("确定");
        getContentPane().add(jButton);

    }

    class TextFocusListener implements FocusListener {
        @Override
        public void focusGained(FocusEvent e) {//获取焦点时做什么
            textField.setText("");
        }

        @Override
        public void focusLost(FocusEvent e) {//失去焦点时做什么
            textField.setText("2001-01-16");
        }
    }
}

5.3、鼠标事件

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MouseEventText extends JFrame {
    public static void main(String[] args) {
        new MouseEventText();
    }
    public MouseEventText(){
        super();//继承父类构造器
        setTitle("鼠标事件处理");
        setBounds(100,100,500,375);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        final JLabel jLabel = new JLabel();//添加标签
        jLabel.setText("Hello");
        //MouseAdapter适配器  MouseListener
        //MouseAdapter适配器实现了MouseListener接口,
        // 这样做可以让你不用重写MouseListener接口中所有的方法
        //只需要重写你需要的方法。
        /**jLabel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("光标移入组件");
            }

        });*/
        jLabel.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("单击了鼠标按键");
                int i=e.getButton();//获取你单击的键,返回一个int值
                if (i==MouseEvent.BUTTON1)//1
                    System.out.println("单击了左键1111");
                if (i==MouseEvent.BUTTON2)//2
                    System.out.println("单击中键2222");
                if (i==MouseEvent.BUTTON3)//3
                    System.out.println("单击右键3333");
                int clickCount=e.getClickCount();//获取鼠标单击次数
                System.out.println(clickCount);

            }

            //mousePressed鼠标按键被按下
            //可以判断是哪个鼠标按键
            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("鼠标按键被按下");
                int i=e.getButton();//获取你按下的键,返回一个int值
                if (i==MouseEvent.BUTTON1)
                    System.out.println("按下了左键1111");
                if (i==MouseEvent.BUTTON2)
                    System.out.println("按下中键2222");
                if (i==MouseEvent.BUTTON3)
                    System.out.println("按下右键3333");
            }

            //mouseReleased鼠标按键被按下
            //可以判断是哪个鼠标按键
            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("鼠标按键被释放");
                int i=e.getButton();//获取你释放的键,返回一个int值
                if (i==MouseEvent.BUTTON1)//1
                    System.out.println("释放了左键1111");
                if (i==MouseEvent.BUTTON2)//2
                    System.out.println("释放中键2222");
                if (i==MouseEvent.BUTTON3)//3
                    System.out.println("释放右键3333");
            }

            //mouseEntered(移入)
            //mouseExited(移除)
            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("光标移入组件");
            }
            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println("光标移出组件");
            }
        });
        getContentPane().add(jLabel, BorderLayout.CENTER);
    }
}

5.3、键盘事件

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyEventText extends JFrame {
    public static void main(String[] args) {
        new KeyEventText();
    }
    public KeyEventText(){
        super();
        setTitle("键盘事件示例");
        setBounds(100,100,500,375);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container container = this.getContentPane();


        final JLabel jLabel = new JLabel();
        jLabel.setText("备注:");
        container.add(jLabel, BorderLayout.WEST);

        final JScrollPane jScrollPane = new JScrollPane();
        container.add(jScrollPane, BorderLayout.CENTER);

        final JTextArea jTextArea = new JTextArea();
        jTextArea.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {//发生键盘事件
                System.out.println("此次输入的是“"+e.getKeyChar()+"”");
            }

            @Override
            public void keyPressed(KeyEvent e) {
                //getKeyCode获取这个键对应的Code码
                String keyText = KeyEvent.getKeyText(e.getKeyCode());
                if (e.isActionKey()){//是否是动作键
                    System.out.println("你按下的是动作键");
                }else {
                    System.out.println("你按下的是非动作键“"+keyText+"”");
                    //getKeyChar 返回每次敲击的字符,其实看单词就能看出来了
                    char keyChar = e.getKeyChar();
                    switch (keyChar){
                        case KeyEvent.VK_CONTROL:
                            System.out.println("你按下了Ctrl");
                            break;
                        case KeyEvent.VK_SHIFT:
                            System.out.println("你按下了SHIFT");
                            break;
                        case KeyEvent.VK_ALT:
                            System.out.println("你按下了ALT");
                            break;
                    }
                }

            }

            @Override
            public void keyReleased(KeyEvent e) {//键盘键被释放
                String KeyText = KeyEvent.getKeyText(e.getKeyCode());
                System.out.println("你释放的是“"+KeyText+"”键");
                System.out.println();
            }
        });
        jTextArea.setLineWrap(true);//设置自动换行
        jTextArea.setRows(3);
        jTextArea.setColumns(15);
        jScrollPane.setViewportView(jTextArea);
    }
}

ps:不知道怎么回事,运行出来窗体控件不会显示,得拖动一下窗口边框大小才可以,如果有看到知道怎么回事的朋友,还请回复告诉我一下下,嘻嘻。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章