使用标志标记 JList 中的选定条目

Using Flags to Mark Selected Entries in a JList

我已经对标志进行了一些研究,但我仍然不太了解如何将它们附加到一般情况下 item/use。我的目标是使用标志来标记 JList 中的所有选定条目,以便在执行搜索时所有显示选定项目的内容都保持选中状态,而当清除搜索时,所有先前选定的项目都会重新突出显示。此外,当搜索并选择一个术语时,它会在清除搜索后保持突出显示。有人告诉我标志是最好的方法,但我不知道我会怎么做。

你的问题有点断章取义,例如,我不知道你是如何刷新你的观点的。

但我可能会想使用 JTable 而不是 JList,因为它是可编辑的,并且内置了渲染 JCheckBox

之类的东西

但是,首先,我会从一个容器对象开始,它既可以承载选定状态,也可以承载我想要与之关联的值...

搜索词

public class SearchTerm {

    private boolean selected;
    private String text;

    public SearchTerm(boolean selected, String text) {
        this.selected = selected;
        this.text = text;
    }

    public boolean isSelected() {
        return selected;
    }

    public String getText() {
        return text;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }

}

很简单,现在因为状态在对象内部保持,您可以四处移动对象,它的状态(和其他内容)将保持不变。

不,我们需要一些方法来对此建模,它维护我们想要控制它的逻辑(所以只有复选框是可编辑的)

SearchTermTableModel

public class SearchTermTableModel extends AbstractTableModel {

    private List<SearchTerm> searchTerms;

    public SearchTermTableModel() {
        searchTerms = new ArrayList<>(25);
    }

    public void add(SearchTerm searchTerm) {
        searchTerms.add(searchTerm);
        fireTableRowsInserted(searchTerms.size() - 1, searchTerms.size() - 1);
    }

    @Override
    public int getRowCount() {
        return searchTerms.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public String getColumnName(int column) {
        return column == 0 ? "" : "Search Term";
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return columnIndex == 0 ? Boolean.class : String.class;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        SearchTerm term = searchTerms.get(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = term.isSelected();
                break;
            case 1:
                value = term.getText();
                break;
        }
        return value;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return columnIndex == 0;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        switch (columnIndex) {
            case 0:
                if (aValue instanceof Boolean) {
                    SearchTerm term = searchTerms.get(rowIndex);
                    term.setSelected((Boolean)aValue);
                    super.setValueAt(aValue, rowIndex, columnIndex);
                }
                break;
        }
    }
}

好的,现在,我们只需要将它放在屏幕上供用户玩...

model = new SearchTermTableModel();
model.add(new SearchTerm(false, "Bananas"));
model.add(new SearchTerm(false, "Apples"));
model.add(new SearchTerm(false, "Streberries"));
model.add(new SearchTerm(false, "Poines with guns"));
model.add(new SearchTerm(false, "Anime"));
model.add(new SearchTerm(false, "Helicopters"));
model.add(new SearchTerm(false, "Sunny beaches which I'm not on"));

setLayout(new BorderLayout());
table = new JTable(model);
add(new JScrollPane(table));

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTable table;
        private SearchTermTableModel model;

        public TestPane() {
            model = new SearchTermTableModel();
            model.add(new SearchTerm(false, "Bananas"));
            model.add(new SearchTerm(false, "Apples"));
            model.add(new SearchTerm(false, "Streberries"));
            model.add(new SearchTerm(false, "Poines with guns"));
            model.add(new SearchTerm(false, "Anime"));
            model.add(new SearchTerm(false, "Helicopters"));
            model.add(new SearchTerm(false, "Sunny beaches which I'm not on"));

            setLayout(new BorderLayout());
            table = new JTable(model);
            add(new JScrollPane(table));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

    public class SearchTerm {

        private boolean selected;
        private String text;

        public SearchTerm(boolean selected, String text) {
            this.selected = selected;
            this.text = text;
        }

        public boolean isSelected() {
            return selected;
        }

        public String getText() {
            return text;
        }

        public void setSelected(boolean selected) {
            this.selected = selected;
        }

    }

    public class SearchTermTableModel extends AbstractTableModel {

        private List<SearchTerm> searchTerms;

        public SearchTermTableModel() {
            searchTerms = new ArrayList<>(25);
        }

        public void add(SearchTerm searchTerm) {
            searchTerms.add(searchTerm);
            fireTableRowsInserted(searchTerms.size() - 1, searchTerms.size() - 1);
        }

        @Override
        public int getRowCount() {
            return searchTerms.size();
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public String getColumnName(int column) {
            return column == 0 ? "" : "Search Term";
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return columnIndex == 0 ? Boolean.class : String.class;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            SearchTerm term = searchTerms.get(rowIndex);
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = term.isSelected();
                    break;
                case 1:
                    value = term.getText();
                    break;
            }
            return value;
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return columnIndex == 0;
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            switch (columnIndex) {
                case 0:
                    if (aValue instanceof Boolean) {
                        SearchTerm term = searchTerms.get(rowIndex);
                        term.setSelected((Boolean) aValue);
                        super.setValueAt(aValue, rowIndex, columnIndex);
                    }
                    break;
            }
        }
    }

}

查看 How to Use Tables 了解更多详情