java - 如何使用 Java 中的 actionlistener 按字母顺序对联系人列表进行排序?
问题描述
我有一个 java 任务,我应该按字母顺序对示例联系人列表进行排序,从姓氏到名字,包括他们的电话号码。我一直在尝试使用 lastName、firstName、nameList 和 numberList 之类的东西,但仍然无法获得正确的信息来让列表按字母顺序从姓氏到名字进行排序。如果我能得到一些帮助或提示来帮助我前进,那就太好了。我目前也在使用 actionlistener 来帮助我对列表进行排序。
这是构造函数代码的一部分。
public class ContactList extends JFrame implements ActionListener, ListSelectionListener {
JMenuItem newMI, openMI, saveMI, saveAsMI, exitMI;
JMenuItem searchMI, deleteMI, updateMI, newEntryMI, sortMI;
JTextField lastName, firstName, phoneNumber;
JList<String> listView;
DefaultListModel<String> nameList = new DefaultListModel<String>();
Vector<String> numberList = new Vector<String>();
File currentFile = null;
/**
* Constructor
*/
public ContactList() {
super("Phone Contacts"); // set frame title
setLayout(new BorderLayout()); // set layout
// create menu bar
JMenuBar menubar = new JMenuBar();
setJMenuBar(menubar);
// create file menu
JMenu fileMenu = new JMenu("File");
menubar.add(fileMenu);
newMI = fileMenu.add(new JMenuItem("New"));
newMI.addActionListener(this);
openMI = fileMenu.add(new JMenuItem("Open"));
openMI.addActionListener(this);
fileMenu.addSeparator();
saveMI = fileMenu.add(new JMenuItem("Save"));
saveAsMI = fileMenu.add(new JMenuItem("Save As ..."));
fileMenu.addSeparator();
exitMI = fileMenu.add(new JMenuItem("Exit"));
exitMI.addActionListener(this);
// create edit menu
JMenu editMenu = new JMenu("Edit");
menubar.add(editMenu);
updateMI = editMenu.add(new JMenuItem("Update"));
updateMI.addActionListener(this);
newEntryMI = editMenu.add(new JMenuItem("New Entry"));
newEntryMI.addActionListener(this);
deleteMI = editMenu.add(new JMenuItem("Delete"));
deleteMI.addActionListener(this);
editMenu.addSeparator();
searchMI = editMenu.add(new JMenuItem("Search"));
searchMI.addActionListener(this);
sortMI = editMenu.add(new JMenuItem("Sort"));
sortMI.addActionListener(this);
// create phone list and controls
JPanel listPanel = new JPanel(new BorderLayout());
add(listPanel, BorderLayout.CENTER);
JLabel label = new JLabel("Name List", JLabel.LEFT);
listPanel.add(label, BorderLayout.NORTH);
listView = new JList<String>(nameList);
listView.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listView.addListSelectionListener(this);
JScrollPane listScroller = new JScrollPane(listView);
listPanel.add(listScroller, BorderLayout.CENTER);
JPanel panel = new JPanel(new BorderLayout());
add(panel, BorderLayout.WEST);
JPanel editPanel = new JPanel(new GridLayout(6, 1));
panel.add(editPanel, BorderLayout.NORTH);
label = new JLabel("Last Name", Label.LEFT);
editPanel.add(label);
lastName = new JTextField();
editPanel.add(lastName);
label = new JLabel("First Name", Label.LEFT);
editPanel.add(label);
firstName = new JTextField();
editPanel.add(firstName);
label = new JLabel("Phone Number", Label.LEFT);
editPanel.add(label);
phoneNumber = new JTextField();
editPanel.add(phoneNumber);
}
这是分配的动作侦听器代码。我也不需要对电话号码进行排序。只是姓对名。来源来自我试图弄清楚的 sortMI 问题。
// implementing ActionListener
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source == newMI) {
nameList.clear();
numberList.clear();
currentFile = null;
display(-1);
setTitle("Phone Contacts"); // reset frame title
}
else if(source == openMI) {
doOpen();
}
else if(source == deleteMI) {
nameList.remove(getState());
numberList.remove(getName());
}
else if(source == exitMI) {
System.exit(0);
}
else if(source == updateMI) {
int index = listView.getSelectedIndex();
String name = lastName.getText().trim() + " " + firstName.getText().trim();
String number = phoneNumber.getText().trim();
if(index < 0) { // add a new entry
nameList.addElement(name);
numberList.addElement(number);
index = nameList.getSize()-1;
}
else { // update an existing entry
nameList.set(index, name);
numberList.set(index, number);
}
listView.setSelectedIndex(index);
listView.ensureIndexIsVisible(index);
}
else if(source == newEntryMI) {
listView.clearSelection();
display(-1);
}
else if(source == searchMI) {
String searchName = JOptionPane.showInputDialog(this,
"Please enter a name (last first) to search:");
System.out.println("Name to search: " + searchName);
nameList.contains(searchName);
return;
}
else if(source == sortMI) {
lastName.getText();
firstName.getText();
}
}
我也确实在 java 中寻找了其他排序示例,但它不涉及带有 actionlistener 的示例。
解决方案
- 在 class 中使用方法copyInto
DefaultListModel
来获取nameList
数组的内容。 - 在 class 中使用方法sort
java.util.Arrays
对数组进行排序。 DefaultListModel
从排序后的数组创建一个新的。- 为 设置模型
listView
。
Object[] objs = nameList.copyInto();
Arrays.sort(objs, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
String s1 = o1 == null ? "" : o1.toString();
String s2 = o2 == null ? "" : o2.toString();
return s1.compareTo(s2);
}
});
nameList = new DefaultListModel(objs);
listView.setModel(nameList);
或者,您可以使用流 API
Object[] objs = nameList.copyInto();
List<String> list = Arrays.stream(objs)
.map(obj -> obj == null ? "" : obj.toString())
.sorted()
.collect(Collectors.toList());
Vector<Object> v = new Vector<>(list);
nameList = new DefaultListModel(v);
listView.setModel(nameList);
推荐阅读
- react-native - 如何将预测函数与转换为原生反应的模型一起使用
- c# - 包括动态自定义 Xamarin Xaml 视图控件
- reactjs - 从 Gitlab 到 Firebase 的 React 部署失败并出现错误:指定的公共目录“构建”不存在,无法将托管部署到站点
- javascript - VS IDE 中的奇怪 JavaScript 警告
- c# - WPF 数据绑定到自更新模型
- scala - 错误:bulkCopyToSqlDB 不是 org.apache.spark.sql.DataFrameWriter 的成员
- python - 如何解决程序的计数问题?
- java - 发现以元素 '{"http://maven.apache.org/POM/4.0.0":plugins}' 开头的无效内容
- html - 显示动态列表/项目列的最佳方式?
- javascript - CSS:如何在窗口容器内包含绝对元素