Question

I have a JList set up to use the contents of an ArrayList of SamplePerson objects. Each SamplePerson automatic creates a random name when created. I am trying to get the JList to show the name of the sample person in the JList for the selections, however the list comes up blank. The Oracle tutorials have helped a bit, but I still can't figure out how to get it to show up.

package main;

import java.awt.Component;

class SamplePerson{
private String firstName, lastname;
private static final String[] firstNameChoices = {"Mark", "Eric", "Henry", "Carl", "Watson"};
private static final String[] lastNameChoices = {"Smith", "Castle", "Baldwin", "Anderson"};

// A bunch of other fields that would go here are omitted for clarity.

String personDescription;
Random rand = new Random();

public SamplePerson() {
    initalizeName();
    personDescription = "This is a placeholder";

    // Other fields are initialized here.
}

private void initalizeName(){
    firstName = firstNameChoices[rand.nextInt(firstNameChoices.length)];
    lastname = lastNameChoices[rand.nextInt(lastNameChoices.length)];
}

public String getFullName() {
    return firstName +" " + lastname;
}

public String getFullNameLastNameFirst() {
    return lastname + ", " + firstName;
}

public String getPersonDescription() {
    return personDescription;
}
}

public class ListAppTest implements ListSelectionListener{

private JFrame frame;
private JTextPane textPane;
private JList<SamplePerson> list;

private ArrayList<SamplePerson> arrayListOfPeople;
private ListModel<SamplePerson> listMod;
private ListCellRenderer<SamplePerson> listRender;
private JLabel lblListOfPeople;
private JLabel lblDescription;

private String description;
/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ListAppTest window = new ListAppTest();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public ListAppTest() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {

    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    listRender = new ListCellRenderer<SamplePerson>() {

        @Override
        public Component getListCellRendererComponent(
                JList<? extends SamplePerson> list, SamplePerson value, int index,
                boolean isSelected, boolean cellHasFocus) {

            JLabel thisLabel = new JLabel(value.getFullName());
            thisLabel.setBounds(0, 0, 61, 16);
            return thisLabel;
        }
    };

    arrayListOfPeople = new ArrayList<SamplePerson>();

    addToArrayListOfPeople(6);

    listMod = new DefaultListModel<SamplePerson>();

    list = new JList<SamplePerson>(listMod);
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setSelectedIndex(1);
    list.setCellRenderer(listRender);

    list.setBounds(30, 30, 120, 220);
    list.addListSelectionListener(this);

    frame.getContentPane().add(list);
    if(list.getSelectedIndex() != -1){
        description = list.getSelectedValue().getPersonDescription();
    }else{
        description = "";
    }

    textPane = new JTextPane();
    textPane.setText(description);
    textPane.setEditable(false);
    textPane.setBounds(230, 50, 160, 170);

    frame.getContentPane().add(textPane);

    lblListOfPeople = new JLabel("List of People");
    lblListOfPeople.setBounds(30, 22, 90, 16);
    frame.getContentPane().add(lblListOfPeople);

    lblDescription = new JLabel("Description");
    lblDescription.setBounds(230, 22, 80, 16);
    frame.getContentPane().add(lblDescription);

}

private void addToArrayListOfPeople(int peopleToAdd){
    for (int i = 0; i < peopleToAdd; i++) {
        arrayListOfPeople.add(new SamplePerson());
    }
}

@Override
public void valueChanged(ListSelectionEvent e) {
    description = list.getSelectedValue().getPersonDescription();
    textPane.setText(description);
}
}
Was it helpful?

Solution

You never add anything to the ListModel...

addToArrayListOfPeople(6);

listMod = new DefaultListModel<SamplePerson>();

You need to add the elements from the ArrayList to the model...

addToArrayListOfPeople(6);

listMod = new DefaultListModel<SamplePerson>();
for (SamplePerson person : arrayListOfPeople) {
    listMod.addElement(person);
}

You should avoid using null layouts as you have no control over the differences in font size, DPI, screen resolution, rendering pipeline or other factors which may effect how a font is rendered. null layouts will increase your work 10 fold and reduce the portability of your application. You'll also have less "weirdness" as Swing is designed to be used with approriate layout managers

You should also be adding your JList to a JScrollPane

Take a look at:

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top