I'm working on a simple app that stores some objects (persons) in an Array, I'm trying to use JOptionPane.showMessageDialog to list them (obj.toString) on the screen.
The problem is that after about six objects, the panel gets taller than the screen and it has no sidebar or some way to drag it to change its size.
Is there a way to implement one of those features or maybe set it to display the objects as a grid, columns or anything else that would fix it?
CodePudding user response:
I think people either forget, or don't know, that you can pass "live components" to the message parameter of the JOptionPane class, this provides you with no end of possibilities, for example...
You could...
Use a JTextArea wrapped in a JScrollPane, for example...
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.StringJoiner;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
List<Person> people = new ArrayList<>(100);
Random rnd = new Random();
for (int index = 0; index < 100; index ) {
Person person = new Person(index, "Person " (index 1), "1234567890", LocalDate.now(), LocalDate.now(), LocalDate.MAX, rnd.nextDouble() * 10.0);
people.add(person);
}
StringJoiner joiner = new StringJoiner("\n----------------------------------------\n\n\n\n", "[\n", "\n]");
for (Person person : people) {
joiner.add(person.toString());
}
JTextArea ta = new JTextArea(20, 30);
ta.setText(joiner.toString());
ta.setCaretPosition(0);
ta.setEditable(false);
JOptionPane.showMessageDialog(null, new JScrollPane(ta));
}
});
}
public class Person {
private int id;
private String name;
private String phoneNumber;
private LocalDate birthDate;
private LocalDate registrationDate;
private LocalDate lastUpdate;
private double finalNote;
public Person(int id, String name, String phoneNumber, LocalDate birthDate, LocalDate registrationDate, LocalDate lastUpdate, double finalNote) {
this.id = id;
this.name = name;
this.phoneNumber = phoneNumber;
this.birthDate = birthDate;
this.registrationDate = registrationDate;
this.lastUpdate = lastUpdate;
this.finalNote = finalNote;
}
@Override
public String toString() {
return new StringJoiner("\n")
.add("Person ID: " getId())
.add("Name: " getName())
.add("Phone number: " getPhoneNumber())
.add("Birth date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getBirthDate()))
.add("Registration date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getRegistrationDate()))
.add("Last date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getLastUpdate()))
.add("Final note: " NumberFormat.getNumberInstance().format(getFinalNote()))
.toString();
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public LocalDate getBirthDate() {
return birthDate;
}
public LocalDate getRegistrationDate() {
return registrationDate;
}
public LocalDate getLastUpdate() {
return lastUpdate;
}
public double getFinalNote() {
return finalNote;
}
}
}
You could...
Use a JList, for example...
import java.awt.Component;
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.StringJoiner;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
List<Person> people = new ArrayList<>(100);
Random rnd = new Random();
for (int index = 0; index < 100; index ) {
Person person = new Person(index, "Person " (index 1), "1234567890", LocalDate.now(), LocalDate.now(), LocalDate.MAX, rnd.nextDouble() * 10.0);
people.add(person);
}
DefaultListModel<Person> model = new DefaultListModel<>();
model.addAll(people);
JList<Person> list = new JList<>(model);
list.setCellRenderer(new PersonListCellRenderer());
list.setVisibleRowCount(5);
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
});
}
public class PersonListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof Person) {
Person person = (Person) value;
StringBuilder sb = new StringBuilder(32);
sb.append("<html><body>")
.append("Person ID: ").append(person.getId()).append("<br>")
.append("Name: ").append(person.getName()).append("<br>")
.append("Phone number: ").append(person.getPhoneNumber()).append("<br>")
.append("Birth date: ").append(DateTimeFormatter.ISO_LOCAL_DATE.format(person.getBirthDate())).append("<br>")
.append("Registration date: ").append(DateTimeFormatter.ISO_LOCAL_DATE.format(person.getRegistrationDate())).append("<br>")
.append("Last update: ").append(DateTimeFormatter.ISO_LOCAL_DATE.format(person.getLastUpdate())).append("<br>")
.append("Final note: ").append(person.getId()).append("<br>")
.append("<hr>")
.append("</body></html>");
value = sb.toString();
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates.
}
}
public class Person {
private int id;
private String name;
private String phoneNumber;
private LocalDate birthDate;
private LocalDate registrationDate;
private LocalDate lastUpdate;
private double finalNote;
public Person(int id, String name, String phoneNumber, LocalDate birthDate, LocalDate registrationDate, LocalDate lastUpdate, double finalNote) {
this.id = id;
this.name = name;
this.phoneNumber = phoneNumber;
this.birthDate = birthDate;
this.registrationDate = registrationDate;
this.lastUpdate = lastUpdate;
this.finalNote = finalNote;
}
@Override
public String toString() {
return new StringJoiner("\n")
.add("Person ID: " getId())
.add("Name: " getName())
.add("Phone number: " getPhoneNumber())
.add("Birth date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getBirthDate()))
.add("Registration date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getRegistrationDate()))
.add("Last date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getLastUpdate()))
.add("Final note: " NumberFormat.getNumberInstance().format(getFinalNote()))
.toString();
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public LocalDate getBirthDate() {
return birthDate;
}
public LocalDate getRegistrationDate() {
return registrationDate;
}
public LocalDate getLastUpdate() {
return lastUpdate;
}
public double getFinalNote() {
return finalNote;
}
}
}
You could...
Use a JTable, for example...
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.StringJoiner;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
List<Person> people = new ArrayList<>(100);
Random rnd = new Random();
for (int index = 0; index < 100; index ) {
Person person = new Person(index, "Person " (index 1), "1234567890", LocalDate.now(), LocalDate.now(), LocalDate.MAX, rnd.nextDouble() * 10.0);
people.add(person);
}
TableModel model = new PersonTableModel(people);
JTable table = new JTable(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JOptionPane.showMessageDialog(null, new JScrollPane(table));
}
});
}
public class PersonTableModel extends AbstractTableModel {
private List<Person> people;
private String[] columnNames = new String[]{"ID", "Name", "Phone number", "Date of birth", "Date of registration", "Last updated", "Final note"};
public PersonTableModel(List<Person> people) {
this.people = people;
}
@Override
public int getRowCount() {
return people.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return Integer.class;
case 1:
case 2:
return String.class;
case 3:
case 4:
case 5:
return LocalDate.class;
case 6:
return Double.class;
}
return String.class;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Person person = people.get(rowIndex);
switch (columnIndex) {
case 0:
return person.getId();
case 1:
return person.getName();
case 2:
return person.getPhoneNumber();
case 3:
return person.getBirthDate();
case 4:
return person.getRegistrationDate();
case 5:
return person.getLastUpdate();
case 6:
return person.getFinalNote();
}
return null;
}
}
public class Person {
private int id;
private String name;
private String phoneNumber;
private LocalDate birthDate;
private LocalDate registrationDate;
private LocalDate lastUpdate;
private double finalNote;
public Person(int id, String name, String phoneNumber, LocalDate birthDate, LocalDate registrationDate, LocalDate lastUpdate, double finalNote) {
this.id = id;
this.name = name;
this.phoneNumber = phoneNumber;
this.birthDate = birthDate;
this.registrationDate = registrationDate;
this.lastUpdate = lastUpdate;
this.finalNote = finalNote;
}
@Override
public String toString() {
return new StringJoiner("\n")
.add("Person ID: " getId())
.add("Name: " getName())
.add("Phone number: " getPhoneNumber())
.add("Birth date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getBirthDate()))
.add("Registration date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getRegistrationDate()))
.add("Last date: " DateTimeFormatter.ISO_LOCAL_DATE.format(getLastUpdate()))
.add("Final note: " NumberFormat.getNumberInstance().format(getFinalNote()))
.toString();
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public LocalDate getBirthDate() {
return birthDate;
}
public LocalDate getRegistrationDate() {
return registrationDate;
}
public LocalDate getLastUpdate() {
return lastUpdate;
}
public double getFinalNote() {
return finalNote;
}
}
}




