前言

henu期末要考,都是一些简单的记录,但是还是对窗口设计有了一些理解

Swing是JAVA基础类的一部分,Swing的功能组件大多都由类来实现。J开头的像JFrame、JButton都是swing下的,Frame、Button都是awt下的,而swing是awt的升级版。Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表 ,是java工具开发的首选.

QQ截图20221104234104

窗口

窗口类组件,可以独立显示,一个图形界面至少需要一个窗口,绝大多数 Swing 图形界面程序使用 JFrame 作为顶层容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package JFrame;
import java.awt.Color;
import javax.swing.*;

public class Text1 {

public static void main(String[] args) {
Color bgColor = Color.red;
JFrame jf = new JFrame("测试窗口"); // 创建窗口,并设计标题
jf.setSize( 400, 400); // 设置窗口大小
jf.getContentPane().setBackground(bgColor); //JFrame不能直接添加组件,需要用getContentPane()函数获取内容面板,再在内容面板上进行添加组件。
//jf.setLocationRelativeTo(null); // 把窗口位置设置到屏幕中心
jf.setLocation(200,200); //设置初始位置
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 当点击窗口的关闭按钮时退出程序(没有这一句,程序不会退出)
jf.setVisible(true); // 显示
}
}

面板

中间容器充当基本组件的载体,不可独立显示。中间容器可以添加若干基本组件(也可以嵌套添加中间容器),对容器内的组件进行管理,类似于给各种复杂的组件进行分组管理。最顶层的一个中间容器必须依托在顶层容器(窗口)内。
JPanel 是在开发中使用频率非常高的一般轻量级面板容器组件。

JavaSwing 布局管理器

  1. FlowLayout(流式布局)
1
2
3
4
5
FlowLayout.LEFT :       左对齐
FlowLayout.CENTER : 居中对齐(默认)
FlowLayout.RIGHT : 右对齐
FlowLayout.LEADING : 与容器方向的开始边对齐,例如,对于从左到右的方向,则与左边对齐
FlowLayout.TRAILING : 与容器方向的结束边对齐,例如,对于从左到右的方向,则与右边对齐。

QQ截图20221105100817

  1. BorderLayout(边界布局)

    1
    2
    3
    4
    5
    6
    // 把 5 个按钮添加到容器中的 5 个方位
    panel.add(btnN, BorderLayout.NORTH);
    panel.add(btnS, BorderLayout.SOUTH);
    panel.add(btnW, BorderLayout.WEST);
    panel.add(btnE, BorderLayout.EAST);
    panel.add(btnC, BorderLayout.CENTER);
  2. GridLayout(网格布局)

    1
    2
    3
    4
    5
    6
    7
    JPanel panel3 = new JPanel(new GridLayout(2, 1));

    JButton btnN3 = new JButton("Button_North");
    JButton btnS3 = new JButton("Button_South");

    panel3.add(btnN3);
    panel3.add(btnS3);

组件

  1. JButton(按钮)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    JButton button1=new JButton("start");
    JButton button2=new JButton("stop");

    button1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    System.out.println("start");
    }
    });
    MyMonitor myMonitor=new MyMonitor();
    button2.addActionListener(myMonitor);
    // 设置按钮的默认图片button2.setIcon(new ImageIcon("button_normal.png"));
    // 设置按钮被点击时的图片button2.setPressedIcon(new ImageIcon("button_press.png"));
    Jf.add(button1,BorderLayout.EAST);
    Jf.add(button2,BorderLayout.WEST);
    Jf.pack();
    Jf.setSize( 400, 400);
    }
    }
    class MyMonitor implements ActionListener{
    public void actionPerformed(ActionEvent e) {
    System.out.println("Stop");
    }
    }
  2. JLabel(标签)

    1
    2
    3
    4
    JPanel panel = new JPanel();
    // 添加一个标签
    JLabel label = new JLabel("水果:");
    panel.add(label);
  3. JTextField(文本框)

  4. JTextArea(文本区域)

    1
    2
    3
    4
    5
    6
    7
    JPanel panel = new JPanel();
    // 创建一个 5 行 10 列的文本区域
    final JTextArea textArea = new JTextArea(5, 10);
    // 设置自动换行
    textArea.setLineWrap(true);
    // 添加到内容面板
    panel.add(textArea);
  5. JComboBox(下拉列表框)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
         // 需要选择的条目
    String[] listData = new String[]{"香蕉", "雪梨", "苹果", "荔枝"};
    // 创建一个下拉列表框
    JComboBox comboBox = new JComboBox(listData);
    // 设置默认选中的条目
    comboBox.setSelectedIndex(2);
    // 添加到内容面板
    panel.add(comboBox);
    //增加元素
    cb_channel.addItem("123");
    //获取选中的选项索引
    int i=cb_channel.getSelectedIndex();

    //为组合框注册监听器ItemListener
    cb_channel.addItemListener(new ItemListener(){
    public void itemStateChanged(ItemEvent e) {
    int i=cb_channel.getSelectedIndex();
    list_shows.setListData(shows[i]);
    }
    });
  6. JList(列表框)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // 创建一个 JList 实例
    JList list = new JList();
    // 设置一下首选大小
    list.setPreferredSize(new Dimension(200, 100));
    // 设置选择模式,有三个模式: 只能单选、可间隔多选、可连续多选
    list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    // 设置选项数据(内部将自动封装成 ListModel )
    list.setListData(new String[]{"香蕉", "雪梨", "苹果", "荔枝"});
    // 设置默认选中项
    list.setSelectedIndex(1);
    //判断是否有选中的值
    list_shows.isSelectionEmpty()
    //获取所选值
    list_shows.getSelectedValue();
    // 获取所有被选中的选项索引
    int[] indices = list.getSelectedIndices();
    // 获取选中的选项索引
    int getSelectedIndex()

    // 添加选项选中状态被改变的监听器
    list.addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
    // 获取选项数据的 ListModel
    ListModel<String> listModel = list.getModel();
    // 输出选中的选项
    for (int index : indices) {
    System.out.println("选中: " + index + " = " + listModel.getElementAt(index));
    }
    System.out.println();
    }
    });
  7. JDialog(对话框)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /**
    * 显示一个自定义的对话框
    *
    * @param owner 对话框的拥有者
    * @param parentComponent 对话框的父级组件
    */
    private static void showCustomDialog(Frame owner, Component parentComponent) {
    // 创建一个模态对话框
    final JDialog dialog = new JDialog(owner, "提示", true);
    // 设置对话框的宽高
    dialog.setSize(250, 150);
    // 设置对话框大小不可改变
    dialog.setResizable(false);
    // 设置对话框相对显示的位置
    dialog.setLocationRelativeTo(parentComponent);
    JLabel messageLabel = new JLabel("对话框消息内容");
    // 创建一个按钮用于关闭对话框
    JButton okBtn = new JButton("确定");
    okBtn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    // 关闭对话框
    dialog.dispose();
    }
    });
    JPanel panel = new JPanel();
    panel.add(messageLabel);
    panel.add(okBtn);
    // 设置对话框的内容面板
    dialog.setContentPane(panel);
    // 显示对话框
    dialog.setVisible(true);
    }
  8. JMenuBar(菜单栏)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    /*
    * 创建一个菜单栏
    */
    JMenuBar menuBar = new JMenuBar();

    /*
    * 创建一级菜单
    */
    JMenu fileMenu = new JMenu("文件");
    JMenu editMenu = new JMenu("编辑");
    JMenu viewMenu = new JMenu("视图");
    JMenu aboutMenu = new JMenu("关于");
    // 一级菜单添加到菜单栏
    menuBar.add(fileMenu);
    menuBar.add(editMenu);
    menuBar.add(viewMenu);
    menuBar.add(aboutMenu);

    /*
    * 创建 "文件" 一级菜单的子菜单
    */
    JMenuItem exitMenuItem = new JMenuItem("退出");
    // 子菜单添加到一级菜单
    fileMenu.addSeparator(); // 添加一条分割线
    fileMenu.add(exitMenuItem);

    /*
    * 创建 "编辑" 一级菜单的子菜单
    */
    JMenuItem copyMenuItem = new JMenuItem("复制");
    JMenuItem pasteMenuItem = new JMenuItem("粘贴");
    // 子菜单添加到一级菜单
    editMenu.add(copyMenuItem);
    editMenu.add(pasteMenuItem);

    /*
    * 创建 "视图" 一级菜单的子菜单
    */
    final JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem("复选框子菜单");
    final JRadioButtonMenuItem radioButtonMenuItem01 = new JRadioButtonMenuItem("单选按钮子菜单01");
    final JRadioButtonMenuItem radioButtonMenuItem02 = new JRadioButtonMenuItem("单选按钮子菜单02");
    // 子菜单添加到一级菜单
    viewMenu.add(checkBoxMenuItem);
    viewMenu.addSeparator(); // 添加一个分割线
    viewMenu.add(radioButtonMenuItem01);
    viewMenu.add(radioButtonMenuItem02);

    // 其中两个 单选按钮子菜单,要实现单选按钮的效果,需要将它们放到一个按钮组中
    ButtonGroup btnGroup = new ButtonGroup();
    btnGroup.add(radioButtonMenuItem01);
    btnGroup.add(radioButtonMenuItem02);

    // 默认第一个单选按钮子菜单选中
    radioButtonMenuItem01.setSelected(true);

    /*
    * 菜单项的点击/状态改变事件监听,事件监听可以直接设置在具体的子菜单上(这里只设置其中几个)
    */
    // 设置 "新建" 子菜单被点击的监听器
    newMenuItem.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("新建 被点击");
    }
    });

  9. JPopupMenu(弹出菜单)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
        // 直接在内容面板上添加鼠标监听器
    panel.addMouseListener(new MouseListener() {
    @Override
    public void mouseClicked(MouseEvent e) {
    // 鼠标点击(按下并抬起)
    }
    @Override
    public void mousePressed(MouseEvent e) {
    // 鼠标按下
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    // 鼠标释放

    // 如果是鼠标右键,则显示弹出菜单
    if (e.isMetaDown()) {
    showPopupMenu(e.getComponent(), e.getX(), e.getY());
    }
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    // 鼠标进入组件区域
    }
    @Override
    public void mouseExited(MouseEvent e) {
    // 鼠标离开组件区域
    }
    });
    public static void showPopupMenu(Component invoker, int x, int y) {
    // 创建 弹出菜单 对象
    JPopupMenu popupMenu = new JPopupMenu();

    // 创建 一级菜单
    JMenuItem copyMenuItem = new JMenuItem("复制");
    JMenuItem pasteMenuItem = new JMenuItem("粘贴");
    JMenu editMenu = new JMenu("编辑"); // 需要 添加 二级子菜单 的 菜单,使用 JMenu
    JMenuItem fileMenu = new JMenuItem("文件");

    // 创建 二级菜单
    JMenuItem findMenuItem = new JMenuItem("查找");
    JMenuItem replaceMenuItem = new JMenuItem("替换");
    // 添加 二级菜单 到 "编辑"一级菜单
    editMenu.add(findMenuItem);
    editMenu.add(replaceMenuItem);

    // 添加 一级菜单 到 弹出菜单
    popupMenu.add(copyMenuItem);
    popupMenu.add(pasteMenuItem);
    popupMenu.addSeparator(); // 添加一条分隔符
    popupMenu.add(editMenu);
    popupMenu.add(fileMenu);

    // 添加菜单项的点击监听器
    copyMenuItem.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("复制 被点击");
    }
    });
    findMenuItem.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("查找 被点击");
    }
    });
    // ......

    // 在指定位置显示弹出菜单
    popupMenu.show(invoker, x, y);
    }

    事件