2014-03-06 71 views
0

我有一個JList設置爲使用SamplePerson對象的ArrayList的內容。每個SamplePerson會在創建時自動創建一個隨機名稱。我試圖讓JList顯示JList中的示例人員的名稱,但是列表顯示爲空白。 Oracle教程已經有所幫助,但我仍然無法弄清楚如何讓它顯示出來。在自定義對象中使用jlist時遇到問題

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); 
} 
} 
+2

您不應該在'getListCellRendererComponent'方法內創建渲染器組件。聲明是否在方法之外,並在方法內改變它的狀態。 –

回答

3

你永遠不添加任何東西到ListModel ...

addToArrayListOfPeople(6); 

listMod = new DefaultListModel<SamplePerson>(); 

您需要從ArrayList到模型中添加元素...

addToArrayListOfPeople(6); 

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

您應該避免使用因爲您無法控制字體大小,DPI,屏幕分辨率,渲染管道或其他可能影響fon效果的因素的差異t被渲染。 null佈局將使您的工作增加10倍,並降低應用程序的可移植性。你也有少「怪誕」的搖擺旨在與approriate佈局管理器使用

你也應該加入你的JListJScrollPane

看看:

+0

感謝您的幫助。空佈局只是爲了當我測試某些東西或試圖讓它工作時,我個人更喜歡使用springLayout(或者當我使用多個面板時使用cardLayout)以獲得更多的工作。 – user3249872

相關問題