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

发布时间:2024年01月07日

注释很详细,直接上代码

新增内容
🧧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();
    }
}

效果演示:

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_73756108/article/details/135427926
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。