Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于筛选列表的组件_Java_Swing_List - Fatal编程技术网

Java 用于筛选列表的组件

Java 用于筛选列表的组件,java,swing,list,Java,Swing,List,什么是Java Swing组件,适合创建如下所示的可过滤列表 这种类型的过滤最容易使用单列JTable完成。表具有内置功能,可添加以下内容的表: …提供排序和筛选的基础。 另见 以下是筛选字体系列名称的示例: 左侧是一个更具“列表外观”的组件,而右侧显示的组件显然是一个表 代码 import java.awt.*; 导入javax.swing.*; 导入javax.swing.border.EmptyBorder; 导入javax.swing.event.*; 导入javax.swing.te

什么是Java Swing组件,适合创建如下所示的可过滤列表


这种类型的过滤最容易使用单列
JTable
完成。表具有内置功能,可添加以下内容的表:

…提供排序和筛选的基础。

另见

以下是筛选字体系列名称的示例:

左侧是一个更具“列表外观”的组件,而右侧显示的组件显然是一个表

代码
import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
导入javax.swing.event.*;
导入javax.swing.text.Document;
导入javax.swing.table.TableRowSorter;
公共类FontFilter{
私有JComponent ui=null;
JTextField filterText;
台式分拣机;
FontFilter(布尔类列表){
initUI(列表状);
}
public void initUI(布尔类列表){
如果(ui!=null){
返回;
}
ui=新的JPanel(新的BorderLayout(4,4));
ui.setboorder(新的空订单(4,4,4,4));
图形环境
=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[]fonts=ge.getAvailableFontFamilyNames();
String[][]tableData=新字符串[fonts.length][1];
对于(int i=0;i
如果您想要或必须只使用标准的Swing组件,那么@andrewhompson所描述的方法就是最好的选择

但若您能够使用第三方库,那个么一个好的选择就是项目中包含的
JXList
组件。此组件是一个
JList
扩展,可以对其内容以及其他有趣的功能进行排序和筛选(检查)

以下代码段是使其工作的基础:

JXList list = new JXList(listModel);
list.setAutoCreateRowSorter(true);
这足以创建并安装一个
RowSorter
实例作为列表的行分类器,可以通过调用
getRowSorter()
方法检索该实例。此方法返回的实际对象是一个
ListSortController
,它继承自
DefaultRowSorter
,还实现了非标准的
SortController
接口

记住这个类层次结构很重要,因为可以以不同的方式提供
RowFilter
。以下所有备选方案均假定行分拣机是自动创建的

注意:在我看来,第一种方法是首选方法,因为我们可以将向下浇铸行分拣机的脏活委托给组件提供行过滤器

1.直接在列表上设置行过滤器 这是设置行筛选器的一种方便方法。但是,合同要求实际列表的行分拣机是符合
SortController
的实例。否则,
setRowFilter(…)
调用无效

2.将行分拣机强制转换为
SortController
此方法与使用
JTable
时相同

例子 下面是一个关于使用
JXList
进行过滤的简单演示。请再次查看更好的示例

import java.awt.BorderLayout;
import java.awt.GraphicsEnvironment;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.jdesktop.swingx.JXList;    

public class FilterListDemo {

    private JXList list;

    private void createAndShowGui() {

        final JTextField filterText = new JTextField(30);
        filterText.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                FilterListDemo.this.createFilter(filterText.getText(), false);
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                FilterListDemo.this.createFilter(filterText.getText(), false);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                FilterListDemo.this.createFilter(filterText.getText(), false);
            }
        });

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] fonts = ge.getAvailableFontFamilyNames();

        list = new JXList(fonts);
        list.setAutoCreateRowSorter(true);

        JPanel content = new JPanel(new BorderLayout(8,8));
        content.add(filterText, BorderLayout.PAGE_START);
        content.add(new JScrollPane(list), BorderLayout.CENTER);
        content.setBorder(BorderFactory.createEmptyBorder(8,8,8,8));

        JFrame frame = new JFrame("Filter List Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void createFilter(String text, final boolean caseSensitive) {

        final String filterText = caseSensitive ? text : text.toUpperCase();

        list.setRowFilter(new RowFilter<ListModel, Integer>() {
            @Override
            public boolean include(RowFilter.Entry<? extends ListModel
                    , ? extends Integer> entry) {

                String entryValue = caseSensitive 
                        ? entry.getStringValue(0) 
                        : entry.getStringValue(0).toUpperCase();

                return filterText == null 
                        || filterText.trim().isEmpty() 
                        || entryValue.contains(filterText.trim());
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new FilterListDemo().createAndShowGui();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.GraphicsEnvironment;
导入javax.swing.BorderFactory;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextField;
导入javax.swing.ListModel;
导入javax.swing.RowFilter;
list.setRowFilter(rowFilter);
SortController<ListModel> sortController 
        = (SortController<ListModel>)list.getRowSorter();
sortController.setRowFilter(rowFilter);
DefaultRowSorter<ListModel, Integer> sorter 
        = (DefaultRowSorter<ListModel, Integer>)list.getRowSorter();
sorter.setRowFilter(rowFilter);
import java.awt.BorderLayout;
import java.awt.GraphicsEnvironment;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.jdesktop.swingx.JXList;    

public class FilterListDemo {

    private JXList list;

    private void createAndShowGui() {

        final JTextField filterText = new JTextField(30);
        filterText.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                FilterListDemo.this.createFilter(filterText.getText(), false);
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                FilterListDemo.this.createFilter(filterText.getText(), false);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                FilterListDemo.this.createFilter(filterText.getText(), false);
            }
        });

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] fonts = ge.getAvailableFontFamilyNames();

        list = new JXList(fonts);
        list.setAutoCreateRowSorter(true);

        JPanel content = new JPanel(new BorderLayout(8,8));
        content.add(filterText, BorderLayout.PAGE_START);
        content.add(new JScrollPane(list), BorderLayout.CENTER);
        content.setBorder(BorderFactory.createEmptyBorder(8,8,8,8));

        JFrame frame = new JFrame("Filter List Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void createFilter(String text, final boolean caseSensitive) {

        final String filterText = caseSensitive ? text : text.toUpperCase();

        list.setRowFilter(new RowFilter<ListModel, Integer>() {
            @Override
            public boolean include(RowFilter.Entry<? extends ListModel
                    , ? extends Integer> entry) {

                String entryValue = caseSensitive 
                        ? entry.getStringValue(0) 
                        : entry.getStringValue(0).toUpperCase();

                return filterText == null 
                        || filterText.trim().isEmpty() 
                        || entryValue.contains(filterText.trim());
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new FilterListDemo().createAndShowGui();
            }
        });
    }
}