swing快速入门(四十)JList、JComboBox实现列表框

注释很详细,直接上代码

上一篇

新增内容
🧧1.列表的属性设置与选项监听器
🧧2.下拉框的属性设置与选项监听器
🧧3.Box中组件填充情况不符合预期的处理方法
🧧4.LIst向Vector的转化方法

源码:

package swing31_40;

import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
import java.util.Vector;

public class swing_test_38 {
    //定义一个JFrame对象
    JFrame jFrame = new JFrame("列表框测试");
    String[] books = {"java自学宝典","轻量级javaEE企业应用实战","Android基础教程","jQuery实战教程","SpringBoot企业级开发"};

    //用一个字符串数组来创建一个JList对象
    JList<String> bookList = new JList<>(books);

    //定义 选择列表项的下拉框
    JComboBox<String> bookSelector;

    //定义 布局选择按钮 所在的面板
    JPanel layoutPanel = new JPanel();

    //定义 布局选择按钮 所在的按钮组
    //这里既然可以直接添加,为什么要按钮组呢?
    //此处的按钮组是用于集合按钮获取其中的数量从而进行单个按钮的初始化选中
    ButtonGroup layoutGroup = new ButtonGroup();

    //定义 选择模式按钮 所在面板
    JPanel selectModePanel = new JPanel();

    //定义 选择模式按钮 所在的按钮组
    ButtonGroup selectModeGroup = new ButtonGroup();

    //定义 喜欢的书籍的文本域
    JTextArea favorite = new JTextArea(4,40);

    public void init(){

        //设置JList的可视高度可以同时展示3个列表项
        bookList.setVisibleRowCount(3);

        //设置Jlist默认选中第二和第三项
        bookList.setSelectionInterval(1,2);

        //添加布局选择按钮
        addLayoutButton("纵向滚动",JList.VERTICAL);
        addLayoutButton("纵向换行",JList.VERTICAL_WRAP);
        addLayoutButton("横向换行",JList.HORIZONTAL_WRAP);

        //添加选择模式按钮
        addSelectModeButton("无限制", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        addSelectModeButton("单选", ListSelectionModel.SINGLE_SELECTION);
        addSelectModeButton("单范围", ListSelectionModel.SINGLE_INTERVAL_SELECTION);

        //将JList和布局选择按钮放置到box中
        Box listBox = Box.createVerticalBox();

        //将JList组件放置到JScrollPane中,并将JScrollPane放置到box中
        //原因:使界面样式达到平衡
        listBox.add(new JScrollPane(bookList));

        //将布局选择按钮放置到box中
        listBox.add(layoutPanel);

        //将选择模式按钮放置到box中
        listBox.add(selectModePanel);

        //为JList添加事件监听器
        bookList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {//当JList的列表项发生变化时,执行此方法
                //获取JList的列表项
                List<String> selectedValuesList = bookList.getSelectedValuesList();

                //清空文本域
                favorite.setText("");

                //将JList的列表项添加到文本域中
                for (String s : selectedValuesList) {

                    //将JList的列表项添加到文本域中
                    favorite.append(s+"\n");
                }
            }
        });


        //定义一个Vector对象
        Vector<String> bookCollection = new Vector<>();

        //将List集合转换为Vector集合
        List<String> books = List.of("java自学宝典","轻量级javaEE企业应用实战","Android基础教程","jQuery实战教程","SpringBoot企业级开发");
        bookCollection.addAll(books);

        //创建JComboBox对象
        bookSelector = new JComboBox<>(bookCollection);

        //为JComboBox添加事件监听器
        bookSelector.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {//当JComboBox的列表项发生变化时,执行此方法

                //获取JComboBox的列表项
                Object selectedItem = bookSelector.getSelectedItem();

                //将JComboBox的列表项显示在文本域中
                favorite.setText(selectedItem.toString());
            }
        });

        //设置JComboBox的列表项可编辑
        bookSelector.setEditable(true);

        //设置下拉列表的可视高度最多显示4个列表项
        bookSelector.setMaximumRowCount(4);

        //为什么将bookSelector添加到面板中呢?
        //如果不这样下拉栏会默认填充所有位置
        JPanel panel = new JPanel();//定义一个JPanel面板
        panel.add(bookSelector);//将JComboBox添加到面板中

        Box box = Box.createHorizontalBox();//定义一个Box面板

        box.add(listBox);//将JList添加到Box面板中
        box.add(panel);//将JPanel添加到Box面板中

        JPanel favoritePanel = new JPanel();//定义一个JPanel面板
        favoritePanel.setLayout(new BorderLayout());//设置布局为BorderLayout
        favoritePanel.add(new JScrollPane(favorite));//将JTextArea添加到JScrollPane中
        favoritePanel.add(new JLabel("您最喜欢的图书:"),BorderLayout.NORTH);//将JLabel添加到JScrollPane的North位置

        jFrame.add(box);//将Box添加到JFrame中(默认居中)
        jFrame.add(favoritePanel,BorderLayout.SOUTH);//将JPanel添加到JFrame的South位置
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置JFrame的默认关闭操作
        jFrame.pack();//设置JFrame自适应大小
        jFrame.setVisible(true);//设置JFrame可见

    }

    //添加布局选择按钮
    public void addLayoutButton(String label,int orientation){
        //设置布局选择按钮的标题以及边框
        layoutPanel.setBorder(new TitledBorder(new EtchedBorder(),"确定选项布局"));

        //创建一个布局选择按钮
        JRadioButton button = new JRadioButton(label);

        //将布局选择按钮添加到按钮面板
        layoutPanel.add(button);

        //默认选中第一个按钮
        if (layoutGroup.getButtonCount()==0){
            button.setSelected(true);
        }

        //将布局选择按钮添加到按钮组
        layoutGroup.add(button);

        //为布局选择按钮添加事件监听器
        button.addActionListener(e->{

            //改变列表框里列表项的布局方向
            bookList.setLayoutOrientation(orientation);
        });

    }

    //添加选择模式按钮
    public void addSelectModeButton(String label,int selectMode){

        //设置选择模式按钮的标题以及边框
        selectModePanel.setBorder(new TitledBorder(new EtchedBorder(),"确定选择模式"));

        //创建一个布局选择按钮
        JRadioButton button = new JRadioButton(label);

        //将布局选择按钮添加到按钮面板
        selectModePanel.add(button);

        //默认选中第一个按钮
        if (selectModeGroup.getButtonCount()==0){
            button.setSelected(true);
        }

        //将布局选择按钮添加到按钮组
        selectModeGroup.add(button);

        //为布局选择按钮添加事件监听器
        button.addActionListener(e->{
            //改变列表框里列表项的选择模式
            bookList.setSelectionMode(selectMode);
        });
    }

    public static void main(String[] args) {
        //启动程序
        new swing_test_38().init();
    }
}

效果演示:

在这里插入图片描述
下一篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/320698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统期末考复盘

简答题4题*5 20分计算题2题*5 10分综合应用2题*10 20分程序填空1题10 10分 1、简答题&#xff08;8抽4&#xff09; 1、在计算机系统上配置OS的目标是什么&#xff1f;作用主要表现在哪个方面&#xff1f; 在计算机系统上配置OS&#xff0c;主要目标是实现:方便性、…

操作系统复习 七、八章

操作系统复习 七、八章 文章目录 操作系统复习 七、八章第七章 内存管理内存管理的基本要求和原理覆盖与交换连续分配管理方式非连续分配管理方式基本分段存储管理方式段页式管理方式补充 第八章 虚拟内存虚拟内存的基本概念请求分页管理方式易混知识点页面置换算法页面分配策略…

memory泄露分析方法(java篇)

#memory泄露主要分为java和native 2种&#xff0c;本文主要介绍java# 测试每天从monkey中筛选出内存超标的app&#xff0c;提单流转到我 首先&#xff0c;辨别内存泄露类型&#xff08;java&#xff0c;还是native&#xff09; 从采到的dumpsys_meminfo_pid看java heap&…

案例:新闻数据加载

文章目录 介绍相关概念相关权限约束与限制完整示例 代码结构解读构建主界面数据请求下拉刷新总结 介绍 本篇Codelab是基于ArkTS的声明式开发范式实现的样例&#xff0c;主要介绍了数据请求和touch事件的使用。包含以下功能&#xff1a; 数据请求。列表下拉刷新。列表上拉加载…

Redis高并发高可用(主从复制、哨兵)

复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。 默认…

C++11 异常

C异常概念 在C中&#xff0c;异常是程序在执行过程中遇到意外情况或错误时抛出的一种机制。当程序运行过程中发生异常&#xff0c;可以通过抛出异常、捕获异常和处理异常来改变程序的正常执行流程。 抛出异常&#xff1a;在程序中&#xff0c;可以使用关键字 throw 来抛出异常…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(3)

Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&#xff08;3&#xff09; 在 Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&#…

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提&#xff1a;电脑已安装Mysql服务&#xff1b; Visual Studio 安装Mysql依赖库&#xff1a; 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索&#xff0c; 安装Mysql.Data (Oracle); (安装成功后&…

libcurl开源库的编译与使用全攻略

libcurl简介 libcurl 是一个广泛使用的、支持多种协议的、开源的客户端URL传输库&#xff0c;提供了许多用于数据传输的API&#xff0c;例如文件传输、FTP、HTTP、HTTPS、SMTP等。libcurl 的主要特点包括 支持多种协议&#xff1a;libcurl 支持多种协议&#xff0c;如 HTTP、F…

【昕宝爸爸小模块】线程的几种状态,状态之间怎样流转

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

什么是信噪比

大家好&#xff0c;今天给大家介绍什么是信噪比&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 “信噪比”是电子技术中经常用到的一个词组&#xff0c;知道它的确切含义有一定意…

Day02

今日任务&#xff1a; 977 有序数组的平方209 长度最小的子数组59 螺旋矩阵Ⅱ 977 有序数组的平方 题目链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/ 双指针问题&#xff0c;以及数组本身时有序的&#xff1b; 思路&#xff1a; 左、右两个…

unet脑肿瘤分割完整代码

U-net脑肿瘤分割完整代码 代码目录数据集网络训练测试 代码目录 数据集 https://www.kaggle.com/datasets/mateuszbuda/lgg-mri-segmentation dataset.py 在这里插入代码片import os import numpy as np import glob from PIL import Image import cv2 import torchvision fr…

如何在“Microsoft Visual Studio”中使用OpenCV构建应用程序

我在这里描述的所有内容都将应用于 OpenCV 的界面。我首先假设您已经阅读并成功完成了 Windows 中的安装教程。因此&#xff0c;在进一步操作之前&#xff0c;请确保您有一个包含 OpenCV 头文件和二进制文件的 OpenCV 目录&#xff0c;并且您已按照此处所述设置环境变量 设置 O…

多智能体强化学习(概念知识,不涉及具体算法)

目录 一、前置知识1.factored value function2.partially observable MDP (POMDP) problem.2.2 Decentralized-POMDP problem2.3 networked decentralized partially observable Markov decision processes (ND-POMDP) problem2.4 上述两种算法的区别 3. Mean Field Multi-Agen…

深信服超融合HCI版本升级,6.0.0R5升级至6.8.0R2

超融合升级&#xff0c;需要满足以下条件及前期准备&#xff1a; 确认HCI的升级序列号有效升级时长大概在一个半小时&#xff0c;安全起见&#xff0c;需预留至少三至四小时窗口期升级前&#xff0c;需要将所有虚拟机关机&#xff0c;涉及到业务无法访问&#xff0c;需提前通知…

redis中的string相关的部分命令

redis命令手册 redis中文官网查看文档 挨个进行输出调试 Redis Setnx 命令 Redis Getrange 命令 Redis Mset 命令 redis 127.0.0.1:6379> MSET key1 "Hello" key2 "World" OK redis 127.0.0.1:6379> GET key1 "Hello" redis 127.0.0.1:…

datavrap-各种各样的条形图(含详细操作步骤)

静态条形图&#xff1a;正确设置数据即可&#xff0c;导出的图形不会随着时间变化 最普通的静态条形图 黑色系风格的静态条形图 动态条形图&#xff1a;导出的图形会随着时间变化 普通的动态条形图 带数字滚动效果的动态条形图 简单的Top排行榜动态条形图 格式更丰富的Top排行榜…

牛客周赛 Round 28 解题报告 | 珂学家 | 组合数学 + 离散化树状数组

前言 整体评价 还是E稍微有点意思&#xff0c;新周赛好像比预期要简单一些, _. 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的新周赛 思路: 模拟 #include <bits/stdc.h>using namespace std;int main() {int res 0;for (int i 0; i < 6; i…

【算法练习】leetcode算法题合集之数组和哈希表篇

重建数组&#xff08;高频&#xff09; LeetCode283.移动零 LeetCode283.移动零 双指针&#xff0c;记录已经处理好的序列的尾部 class Solution {public void moveZeroes(int[] nums) {int k 0;for (int i 0; i < nums.length; i) {if (nums[i] ! 0) {swap(nums, i, k)…