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);
    }
}
阅读剩余 82%

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

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

相关文章

  • Java中如何比较两个数组中元素是否相同

    在Java中,我们可以使用Arrays类提供的equals()方法来比较两个数组中的元素是否相同。 这个方法的用法相对简单,具体来说,它会对比两个数组的长度和每个元素的值,如果两个数组在长度和元素的值上都相同,则返回true,否则返回false。 下面是一个简单的使用示例: int[] arr1 = {1,2,3,4,5}; int[] arr2 = {1,…

    Java 2023年5月26日
    00
  • 浅谈springboot内置tomcat和外部独立部署tomcat的区别

    我们来详细讲解一下“浅谈Spring Boot内置Tomcat和外部独立部署Tomcat的区别”。 什么是Spring Boot内置Tomcat? Spring Boot是一个快速构建应用程序的框架,它可以将Web应用程序打包成独立的JAR文件,并且自带Tomcat容器,所以不需要额外安装Tomcat或其他Web容器即可快速部署应用程序。这种方式称为Spri…

    Java 2023年5月19日
    00
  • spring boot整合mybatis+mybatis-plus的示例代码

    下面我给您讲解一下“spring boot整合mybatis+mybatis-plus的示例代码”的完整攻略。 步骤1 – 添加依赖 首先,我们需要在 pom.xml 中添加以下依赖: <!– Spring Boot Mybatis Starter –> <dependency> <groupId>org.mybati…

    Java 2023年5月20日
    00
  • Java查看线程运行状态的方法详解

    下面是Java查看线程运行状态的方法详解的完整攻略: 什么是线程状态 Java线程有以下几种状态: NEW:刚创建线程,还未执行start()方法。 RUNNABLE:线程执行了start()方法,等待CPU调度执行。 BLOCKED:线程被阻塞,等待获取一个锁。 WAITING:线程等待另一个线程执行一个特定的action,无超时时间。 TIMED_WAI…

    Java 2023年5月19日
    00
  • java程序员必须知道的4个书写代码技巧

    Java程序员必须知道的4个书写代码技巧: 1. 编写清晰简洁的代码 编写清晰简洁的代码可以提高代码的可读性,让代码更易于维护和修改。以下是一些编写清晰简洁代码的技巧: 使用有意义的变量和函数命名,用英文单词或单词缩写命名变量和函数; 尽量减少重复代码,把重复的代码封装成函数或类; 避免使用魔法数值,使用常量代替魔法数值; 使用与语言标准一致的缩进格式和代码…

    Java 2023年5月23日
    00
  • 使用富文本编辑器上传图片实例详解

    使用富文本编辑器上传图片是现代网页开发中非常常见的事情。本文将详细讲解如何使用一些常用的富文本编辑器实现图片上传功能。 使用UEditor富文本编辑器上传图片 UEditor是一款非常流行的富文本编辑器,其支持非常丰富的功能和定制选项,可以快速方便地实现图片上传功能。 步骤1 – 配置UEditor图片上传接口 首先,需要配置UEditor的图片上传接口。这…

    Java 2023年6月15日
    00
  • Java 8 Stream操作类型及peek示例解析

    Java 8 Stream操作类型及peek示例解析 Java 8引入了Stream API,可用于对集合和数组进行函数式操作。本篇攻略将介绍Java 8中Stream API的操作类型,并详细讲解peek()操作的定义、用法和示例。 Stream API操作类型 Stream API包含两种类型的操作:Intermediate(中间操作)和Terminal…

    Java 2023年5月26日
    00
  • Java 实现模拟用户登录的示例代码

    下面是关于Java实现模拟用户登录的示例代码的详细攻略: 一、了解模拟登录的概念 模拟用户登录是指通过程序代码来模拟用户在网页上输入用户名和密码的过程,实现自动登录。 二、实现模拟登录的步骤 获取登录页面表单的URL和提交表单的URL。 构造POST请求,并设置请求头信息。 设置登录参数,将登录参数封装到请求体中,并发送POST请求。 解析响应报文,提取需要…

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