使用标志标记 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 了解更多详情
我已经对标志进行了一些研究,但我仍然不太了解如何将它们附加到一般情况下 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 了解更多详情