Не удается получить каждый элемент из выбранного многострочного Jlist?
После долгих исследований я все еще не могу получить элементы из выбранного многострочного списка. Вот мой код для listSelectionListener:
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
ListModel model = list.getModel();
for(int i=0; i < model.getSize(); i++){
System.out.println( model.getElementAt(i));
}
}
});
Я также добавил кнопку для печати выбранных элементов:
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
ListModel model = list.getModel();
for(int i=0; i < model.getSize(); i++){
System.out.println( model.getElementAt(i));
}
}
});
но все еще получаю тот же результат:
com.example.main.Student@c36b5fb
com.example.main.Student@2e61eb2
com.example.main.Student@151f708e
com.example.main.Student@563e55b0
Я ожидаю выхода "Имя: Paul0 Возраст: 0." Я также попытался добавить DefaultlistModel вместо ListModel, но вывод такой же. Пожалуйста, помогите, я хочу, чтобы каждый элемент внутри выбранной строки. Я использую JDK8. Ниже приведен полный рабочий код.
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.ListModel;
import javax.swing.SwingUtilities;
import javax.swing.JButton;
import java.awt.BorderLayout;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Test3 {
JList<Student> list;
DefaultListModel model;
public Test3() {
list = new JList();
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
ListModel model = list.getModel();
for(int i=0; i < model.getSize(); i++){
System.out.println( model.getElementAt(i));
}
}
});
model = new DefaultListModel();
for (int i = 0; i < 10; i++) {
model.addElement(new Student("Paul" + i, i));
}
list.setModel(model);
list.setCellRenderer(new MyListCellRenderer());
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(list);
JButton btnNewButton = new JButton("Print");
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
ListModel model = list.getModel();
for(int i=0; i < model.getSize(); i++){
System.out.println( model.getElementAt(i));
}
}
});
frame.getContentPane().add(btnNewButton, BorderLayout.NORTH);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Test3();
}
});
}
private class MyListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Student label = (Student) value;
String name = label.getName();
int age = label.getAge();
String labelText = "<html>Name: " + name + "<br/>Age: " + age;
setText(labelText);
return this;
}
}
}
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
1 ответ
getElementAt
возвращает Object
в указанной позиции, которая оказывается Student
в твоем случае. System.out.println
использует объект toString
Метод для печати объекта, поэтому, основываясь на вашем коде, он, кажется, работает.
Но если вы хотите вывод "Name: Paul0 Age: 0."
нужно поменять Student
класс и переопределить toString
способ удовлетворить ваши требования
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
public String toString() {
return "Name: " + getName() + " Age: " + getAge());
}
}
Или что-то типа того
Вы также можете посмотреть на JList#getSelectedValuesList
чтобы получить List
из пунктов, которые выбрал пользователь (но я могу неправильно интерпретировать ваш вопрос)
Вы также можете посмотреть на Object как на суперкласс (для получения более подробной информации обратитесь к разделу "Метод toString()").