Java图形用户界面之列表框

下面是Java图形用户界面之列表框的完整攻略:

一、什么是列表框?

列表框(JList)是 Java Swing 组件之一,它除了能够显示列表以外,还能与其他组件协同工作,允许用户进行选择和编辑,非常适用于多项选择的情况下。

二、列表框的基本用法

1. 创建列表框

使用 JList 类创建一个列表框:

JList list = new JList();

2. 给列表框设置数据模型

列表框的数据模型是列表显示的内容,可以使用 ListModel 接口来设置:

String[] data = {"项1", "项2", "项3", "项4"};
ListModel listModel = new DefaultListModel();
for (String d : data) {
    listModel.addElement(d);
}
JList list = new JList(listModel);

除此之外,还可以使用 Vector 或者其他集合类来提供数据源:

Vector<String> data = new Vector<>();
data.add("项1");
data.add("项2");
data.add("项3");
JList list = new JList(data);

3. 将列表框添加到面板中

JFrameJPanel 为例:

JPanel panel = new JPanel();
panel.add(list);
JFrame frame = new JFrame();
frame.add(panel);

4. 监听列表框的选择事件

当用户选择列表中的项时,可以监听列表框的选择事件来处理:

list.addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        // 处理选择事件
    }
});

三、列表框的高级用法

1. 自定义列表项的显示

可以使用 ListCellRenderer 接口来自定义列表项的显示,使其更符合实际需求。例如,为每个列表项增加一个复选框:

class CheckBoxRenderer extends JCheckBox implements ListCellRenderer {
    public CheckBoxRenderer() {
        setOpaque(true);
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
        setText(value.toString());
        setSelected(isSelected);
        return this;
    }
}
JList list = new JList(data);
list.setCellRenderer(new CheckBoxRenderer());

2. 在列表框中显示复杂组件

在某些情况下,可能需要在列表框中显示更复杂的组件,例如按钮和标签等。可以使用 JPanel 将这些组件组装起来,然后设置成列表项的显示组件:

class ButtonPanelRenderer implements ListCellRenderer {
    private JPanel panel;
    private JLabel label;
    private JButton button;

    public ButtonPanelRenderer() {
        panel = new JPanel();
        label = new JLabel();
        button = new JButton("按钮");
        panel.setLayout(new BorderLayout());
        panel.add(label, BorderLayout.CENTER);
        panel.add(button, BorderLayout.EAST);
        panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        panel.setOpaque(true);
    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
        label.setText(value.toString());
        return panel;
    }
}
JList list = new JList(data);
list.setCellRenderer(new ButtonPanelRenderer());

四、示例说明

1. 实现一个复选框列表

以下示例实现了一个复选框列表,每个列表项都带有一个复选框和标签。当用户选择某个复选框时,文字显示为删除线的效果。

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;

public class CheckBoxListDemo {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        String[] data = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};
        JList list = new JList(data);

        class CheckBoxRenderer extends JCheckBox implements ListCellRenderer {
            private Border border = BorderFactory.createEmptyBorder(2, 2, 2, 2);

            public CheckBoxRenderer() {
                setOpaque(true);
            }

            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
                setEnabled(list.isEnabled());
                setSelected(((CheckBoxList) list).isItemSelected(index));
                setText(value.toString());
                setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
                setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
                setFont(list.getFont());
                setBorder(border);
                return this;
            }
        }
        list.setCellRenderer(new CheckBoxRenderer());

        MouseAdapter mouseAdapter = new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                int index = list.locationToIndex(e.getPoint());
                if (index != -1) {
                    JCheckBox checkbox = (JCheckBox) list.getCellRenderer().getListCellRendererComponent(list, list.getModel().getElementAt(index), index, false, false);
                    checkbox.setSelected(!checkbox.isSelected());
                    ((CheckBoxList) list).setItemSelection(index, checkbox.isSelected());
                    list.repaint();
                }
            }
        };
        list.addMouseListener(mouseAdapter);

        panel.add(list);
        frame.add(panel);
        frame.setPreferredSize(new Dimension(300, 200));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    static class CheckBoxList extends JList {
        protected int[] selectedIndexes;

        public CheckBoxList() {
            this.selectedIndexes = new int[]{};
        }

        public boolean isItemSelected(int index) {
            for (int i : selectedIndexes) {
                if (i == index) {
                    return true;
                }
            }
            return false;
        }

        public void setItemSelection(int index, boolean isSelected) {
            if (isSelected) {
                addSelectedIndex(index);
            } else {
                removeSelectedIndex(index);
            }
        }

        private void addSelectedIndex(int index) {
            int n = selectedIndexes.length;
            int[] newIndexes = new int[n + 1];
            System.arraycopy(selectedIndexes, 0, newIndexes, 0, n);
            newIndexes[n] = index;
            selectedIndexes = newIndexes;
        }

        private void removeSelectedIndex(int index) {
            int n = selectedIndexes.length;
            int[] newIndexes = new int[n - 1];
            for (int i = 0, j = 0; i < n; i++) {
                if (selectedIndexes[i] != index) {
                    newIndexes[j++] = selectedIndexes[i];
                }
            }
            selectedIndexes = newIndexes;
        }
    }
}

2. 实现一个列表框带有按钮列表

以下示例实现了一个列表框,每个列表项都包含一个标签和按钮。当用户点击某个按钮时,该项将被从列表中删除。

import javax.swing.*;
import java.awt.*;

public class ButtonListDemo {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        String[] data = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};
        JList list = new JList(data);

        class ButtonPanelRenderer implements ListCellRenderer {
            private JPanel panel;
            private JLabel label;
            private JButton button;

            public ButtonPanelRenderer() {
                panel = new JPanel();
                label = new JLabel();
                button = new JButton("删除");
                panel.setLayout(new BorderLayout());
                panel.add(label, BorderLayout.CENTER);
                panel.add(button, BorderLayout.EAST);
                panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
                panel.setOpaque(true);

                button.addActionListener(e -> {
                    int index = list.getSelectedIndex();
                    if (index != -1) {
                        DefaultListModel model = (DefaultListModel) list.getModel();
                        model.remove(index);
                    }
                });
            }

            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
                label.setText(value.toString());
                return panel;
            }
        }
        list.setCellRenderer(new ButtonPanelRenderer());

        panel.add(list);
        frame.add(panel);
        frame.setPreferredSize(new Dimension(300, 200));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java图形用户界面之列表框 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringBoot整合Security权限控制登录首页

    下面我将详细讲解“SpringBoot整合Security权限控制登录首页”的完整攻略,并给出两个示例来帮助理解。 一、准备工作 1.1 引入依赖 首先,我们需要在pom.xml文件中引入相关依赖: <!– Spring Security依赖 –> <dependency> <groupId>org.springfra…

    Java 2023年5月20日
    00
  • idea搭建可运行Servlet的Web项目

    讲解如下: 1. 前置条件 在开始搭建Web项目之前,你需要确认已完成以下的软件、环境和插件的安装和配置: Java JDK 1.8或以上 IntelliJ IDEA 2018或以上版本 TomcatServer插件 如果你的Intellij IDEA没有安装Tomcat Server插件,请按照以下步骤进行安装: 在IntelliJ IDEA中打开 Set…

    Java 2023年6月15日
    00
  • SpringMVC异步处理的 5 种方式示例详解

    针对“SpringMVC异步处理的 5 种方式示例详解”的完整攻略,我将从以下几个方面进行详细讲解: 什么是SpringMVC异步处理 SpringMVC异步处理的5种方式 异步处理方式的示例说明 总结 1. 什么是SpringMVC异步处理 在SpringMVC中,一般的请求处理是同步的,也就是说请求到达后一直会占用线程,等待响应并返回结果。但是面对一些复…

    Java 2023年5月16日
    00
  • 为什么Java 8取消了永久代?

    为什么Java 8取消了永久代? 在Java 8之前,Java虚拟机有一块非堆内存称为永久代(PermGen),它专门用于存放类的元数据信息、常量池、方法区和静态变量等内容。由于永久代有一定的内存限制,并且它是基于线性扫描和GC Roots扫描来进行垃圾回收的,所以在大量类的场景下容易出现“永久代溢出”的问题。此外,永久代和堆内存的内存管理方式不同,会导致被…

    Java 2023年5月11日
    00
  • Servlet3.0实现文件上传的方法

    Servlet是Java Web中最常用的技术之一,而文件上传又是Web应用程序中常用的一种功能,主要用于上传图片、音频、视频等文件。本文将详细介绍如何使用Servlet3.0实现文件上传的方法。 1. 基本概念 在开始之前,我们需要了解一些基本概念: 1.1 enctype 在HTML页面中指定表单的enctype属性是非常重要的,因为它决定了如何对表单数…

    Java 2023年6月15日
    00
  • Java之Jackson使用案例详解

    Java之Jackson使用案例详解 Jackson是Java中最流行的JSON序列化和反序列化库之一,它提供了轻量级快速、灵活的JSON处理方式。本文将详细讲解在Java中如何使用Jackson进行JSON序列化和反序列化。内容如下: 简介 在Java中使用Jackson进行JSON处理时,可以使用以下依赖: <!– Jackson核心模块 –&…

    Java 2023年5月26日
    00
  • java中functional interface的分类和使用详解

    Java中Functional Interface的分类和使用详解 在Java 8中,添加了对函数式编程的支持,也就引入了Functional Interface。Functional Interface是指只包含一个抽象方法的接口,它可以被转换为lambda表达式。在本文中,我们将详细介绍Functional Interface的分类和使用方式。 Func…

    Java 2023年5月26日
    00
  • SSM框架把日志信息保存到数据库过程详解

    我来为你详细讲解“SSM框架把日志信息保存到数据库过程详解”的完整攻略。 一、什么是日志信息? 日志是指记录应用程序运行时产生的信息的一种机制,即将系统状态、行为和异常信息以文本或XML格式记录下来,供系统管理、软件开发、故障排查等方面进行分析、追踪和调试。 二、为什么要把日志信息保存到数据库? 为了更好地管理和维护系统,我们通常需要把日志信息保存到数据库中…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部