Java AWT Swing77_swing_列表框_不强制存储的ListModel和ComBoxModel

本文介绍了如何在JavaSwing中使用自定义的ListModel和ComboBoxModel,以实现动态数据管理和避免直接存储大量数据,适用于数据量大或需要根据用户输入变化的应用场景。
摘要由CSDN通过智能技术生成

Java AWT Swing: 实现灵活的列表框与下拉列表 - 使用非强制存储的ListModel和ComboBoxModel

在Java的Swing库中,列表框(JList)和下拉列表(JComboBox)是两个常用的组件,分别用于展示项目列表和提供下拉选择功能。这两个组件都依赖于模型(Model)来管理其数据,分别是ListModelComboBoxModel。默认情况下,这些组件的实现(如DefaultListModelDefaultComboBoxModel)直接存储数据。然而,Swing提供了足够的灵活性,允许开发者实现自定义的模型,从而支持更加动态的数据管理方式,而不是强制直接存储数据。这篇博客将探讨如何实现和使用非强制存储的ListModelComboBoxModel

基本概念

在Swing中,ListModelComboBoxModel是接口,它们定义了列表和下拉列表组件访问其数据的方式。通过实现这些接口,可以自定义数据的管理方式,例如,从数据库动态查询数据,或者根据其他业务逻辑计算得到列表数据,而无需将所有数据预先加载并存储在内存中。

实现非强制存储的ListModel

要实现一个非强制存储的ListModel,你需要创建一个类实现ListModel<E>接口,并实现其所有方法。以下是一个简单示例,展示了如何实现一个动态查询数据库的ListModel

public class DynamicListModel implements ListModel<String> {
    private List<String> data = new ArrayList<>();

    public DynamicListModel() {
        // 假设这里从数据库加载数据
        loadData();
    }

    private void loadData() {
        // 模拟从数据库加载数据
        data.add("项目1");
        data.add("项目2");
        data.add("项目3");
    }

    @Override
    public int getSize() {
        return data.size();
    }

    @Override
    public String getElementAt(int index) {
        return data.get(index);
    }

    @Override
    public void addListDataListener(ListDataListener l) {
        // 实现监听器管理
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
        // 实现监听器管理
    }
}

实现非强制存储的ComboBoxModel

同样地,实现一个自定义的ComboBoxModel也需要创建一个类实现ComboBoxModel<E>接口。由于ComboBoxModel继承自ListModel,除了要实现ListModel的方法外,还需要额外实现几个方法来管理下拉列表的选中项。

public class DynamicComboBoxModel extends AbstractListModel<String> implements ComboBoxModel<String> {
    private List<String> data = new ArrayList<>();
    private Object selectedItem;

    public DynamicComboBoxModel() {
        loadData();
    }

    private void loadData() {
        data.add("选项1");
        data.add("选项2");
        data.add("选项3");
    }

    @Override
    public int getSize() {
        return data.size();
    }

    @Override
    public String getElementAt(int index) {
        if (index >= 0 && index < data.size()) {
            return data.get(index);
        } else {
            return null;
        }
    }

    @Override
    public void setSelectedItem(Object anItem) {
        selectedItem = anItem;
        fireContentsChanged(this, -1, -1);
    }

    @Override
    public Object getSelectedItem() {
        return selectedItem;
    }
}

使用自定义模型

一旦定义了自己的模型,就可以在创建JListJComboBox时使用它们,如下所示:

JList<String> list = new JList<>(new DynamicListModel());
JComboBox<String> comboBox = new JComboBox<>(new DynamicComboBoxModel());

小结

通过实现自定义的ListModelComboBoxModel,开发者可以非常灵活地管理Swing列表和下拉列表的数据,使其更好地适应复杂的应用场景。这种方法尤其适合于数据集较大或者数据需要根据用户输入动态变化的情况。借助Swing提供的这种灵活性和强大功能,你可以构建出既高效又用户友好的Java图形用户界面。

首先,你需要创建一个 `JList` 组件来显示集合中的元素。然后,你可以通过使用 `JRadioButton` 和 `JButton` 组件来添加单选按钮和编辑按钮。 下面是一个简单的示例代码: ```java import javax.swing.*; import java.awt.*; import java.util.ArrayList; public class ListExample extends JFrame { private JList<String> list; private DefaultListModel<String> listModel; public ListExample() { setTitle("List Example"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); listModel = new DefaultListModel<>(); list = new JList<>(listModel); JScrollPane scrollPane = new JScrollPane(list); scrollPane.setPreferredSize(new Dimension(200, 200)); JPanel buttonPanel = new JPanel(new GridLayout(0, 1)); JRadioButton radioButton = new JRadioButton("Select Item"); JRadioButton editButton = new JRadioButton("Edit Item"); JButton addButton = new JButton("Add Item"); ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(radioButton); buttonGroup.add(editButton); buttonPanel.add(radioButton); buttonPanel.add(editButton); buttonPanel.add(addButton); addButton.addActionListener(e -> { String input = JOptionPane.showInputDialog("Enter a new item:"); if (input != null && !input.isEmpty()) { listModel.addElement(input); } }); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(scrollPane, BorderLayout.CENTER); contentPane.add(buttonPanel, BorderLayout.EAST); pack(); setLocationRelativeTo(null); } public static void main(String[] args) { ArrayList<String> items = new ArrayList<>(); items.add("Item 1"); items.add("Item 2"); items.add("Item 3"); ListExample example = new ListExample(); for (String item : items) { example.listModel.addElement(item); } example.setVisible(true); } } ``` 在这个示例中,我们创建了一个 `JList` 组件,使用 `DefaultListModel` 作为数据模型。我们还创建了一个包含单选按钮和编辑按钮的 `JPanel`。 当用户点击“添加按钮”时,我们使用 `JOptionPane.showInputDialog` 显示一个对话框,让用户输入一个新的项目。如果用户输入了一个非空的字符串,我们将其添加到列表中。 最后,我们将 `JList` 组件和按钮面板添加到 `JFrame` 的内容面板中,并使用 `pack` 方法调整窗口的大小。运行程序后,你应该能够看到一个带有单选按钮和编辑按钮的列表框
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值