0

我设置了一个 JList 以使用 SamplePerson 对象的 ArrayList 的内容。每个 SamplePerson 在创建时都会自动创建一个随机名称。我试图让 JList 在 JList 中显示示例人员的姓名以供选择,但是列表显示为空白。Oracle 教程有所帮助,但我仍然不知道如何让它出现。

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);
}
}
4

1 回答 1

3

你永远不会添加任何东西到ListModel...

addToArrayListOfPeople(6);

listMod = new DefaultListModel<SamplePerson>();

您需要将元素从ArrayList模型添加到...

addToArrayListOfPeople(6);

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

您应该避免使用null布局,因为您无法控制字体大小、DPI、屏幕分辨率、渲染管道或其他可能影响字体渲染方式的因素的差异。 null布局将使您的工作增加 10 倍,并降低应用程序的可移植性。由于 Swing 旨在与适当的布局管理器一起使用,因此您的“怪异”也会减少

您还应该将您JList的添加到JScrollPane

看一眼:

于 2014-03-06T05:42:26.307 回答