JList、JComboBox实现列表框

JList和JComboBox都是及其相似的,它们都有一个列表框,只是JComboBox的列表框需要以下拉方式显示出来。

JList、JComboBox实现列表框_第1张图片

 3.设置监听器,监听列表项的变化,JList通过addListSelectionListener完成,JComboBox通过addltemListener完成。

package com.aynu.layout;

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.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
import java.util.Vector;

public class ListTest {
    JFrame jf = new JFrame("列表框测试");
    String[] books ={"三国演义","水浒传","西游记","红楼梦","封神榜"};

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

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

    JTextArea favorite = new JTextArea(4,40);


    //用一个字符串数组来创建一个JList对象
    JList bookList;
    JComboBox bookSelector;

    public void init(){
        //组装视图

        //组装JList相关内容
        bookList = new JList<>(books);

        addBtn2LayoutPanel("纵向滚动",JList.VERTICAL);
        addBtn2LayoutPanel("纵向换行",JList.VERTICAL_WRAP);
        addBtn2LayoutPanel("横向换行",JList.HORIZONTAL_WRAP);

        addBtn2selectModePanel("无限制",ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        addBtn2selectModePanel("单选",ListSelectionModel.SINGLE_SELECTION);
        addBtn2selectModePanel("单范围",ListSelectionModel.SINGLE_INTERVAL_SELECTION);

        //对JList做设置
        bookList.setVisibleRowCount(3);
        bookList.setSelectionInterval(2,4);

        //处理条目选中事件
        bookList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                //获取当前选中的条目
                List selectedValuesList = bookList.getSelectedValuesList();
                //把当前条目的内容设置到文本域中
                favorite.setText("");
                for (String str : selectedValuesList) {
                    favorite.append(str+"\n");

                }
            }
        });

        Box bookListVBox = Box.createVerticalBox();
        bookListVBox.add(new JScrollPane(bookList));    //添加滚动条
        bookListVBox.add(layoutPanel);
        bookListVBox.add(selectModePanel);

        //组装JComboBox
        Vector vector = new Vector<>();
        List list = List.of("三国演义","水浒传","西游记","红楼梦","封神榜");
        vector.addAll(list);

        bookSelector = new JComboBox<>(vector);     //可以直接传数组也可以传vector对象

        bookSelector.setEditable(true);

        bookSelector.setMaximumRowCount(4);

        bookSelector.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                //获取当前已选中的条目,把内容设置到文本域中
                Object selectedItem = bookSelector.getSelectedItem();
                favorite.setText(selectedItem.toString());
            }
        });

        //组装顶部的左右两部分
        Box topBox = Box.createHorizontalBox();
        topBox.add(bookListVBox);
        JPanel bookSelectPanel = new JPanel();
        bookSelectPanel.add(bookSelector);  //先将bookSelector放到Panel当中
        topBox.add(bookSelectPanel);    //将panel添加到topBox当中解决JComboBox组件的拉伸问题

        //组装底部
        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new BorderLayout());

        bottomPanel.add(new JLabel("您最喜欢的图书是:"),BorderLayout.NORTH);
        bottomPanel.add(favorite);

        //组装整体
        Box holeBox = Box.createVerticalBox();
        holeBox.add(topBox);
        holeBox.add(bottomPanel);

        jf.add(holeBox);



        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();
        jf.setVisible(true);

    }

    //封装方法,往layoutPanel中添加单选按钮
    public void addBtn2LayoutPanel(String name,int layoutType){
        //设置标题边框
        layoutPanel.setBorder(new TitledBorder(new EtchedBorder(),"确定选项布局"));

        //创建单选按钮
        JRadioButton button = new JRadioButton(name);
        layoutPanel.add(button);

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

        layoutGroup.add(button);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bookList.setLayoutOrientation(layoutType);
            }
        });
    }
    //封装方法,往selectModePanel中添加按钮
    public void addBtn2selectModePanel(String name,int selectMode){
        //设置标题边框
        selectModePanel.setBorder(new TitledBorder(new EtchedBorder(),"确定选择模式"));

        //创建单选按钮
        JRadioButton button = new JRadioButton(name);

        selectModePanel.add(button);

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

        selectModeGroup.add(button);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bookList.setSelectionMode(selectMode);
            }
        });

    }





    public static void main(String[] args) {
        new ListTest().init();
    }
}

JList、JComboBox实现列表框_第2张图片

 

你可能感兴趣的:(java,jvm,servlet)