2016-09-06 3 views
-1

Я использую Eclipse, программируя на Java. Проблема:ArrayList для JList - более одного элемента объекта

Это, как я хочу, чтобы мой JList для отображения:

1 - Dante 
2 - William 
3 - Jaime 
etc... 

Теперь цифры являются идентификаторы объектов, а также имена, ну, имена.

ArrayList называется TraitList.

Это то, что я получаю, когда я ставлю, что как свойство «модели» в JList из окна Builder в Eclipse:

TraitL.setModel(new AbstractListModel() { 
     String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"}; 
     public int getSize() { 
      return values.length; 
     } 
     public Object getElementAt(int index) { 
      return values[index]; 
     } 
    }); 

Так я изменил его:

TraitL.setModel(new AbstractListModel() { 
     String [] values = new String []; 
     for (int jln = 0; jln < TraitList.size(); jln++){ 
      values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
     } 
     public int getSize() { 
      return values.length; 
     } 
     public Object getElementAt(int index) { 
      return values[index]; 
     } 
    }); 

Это не работает. Я пробовал десятки вариантов. Никто не работал. Итак, как я могу сделать несколько элементов объекта, отображаемых этим списком? Мне все равно, если это DefaultListModel или AbstractListModel, или даже ListModel. Спасибо заранее.

EDIT: Ошибки всех строк с тем, что я пытался в следующем изображении: errors

БОНУС ВОПРОС: Как сделать, нажав на элемент этого списка «actionPerformed» так что-то происходит после того, как я нажму?

+0

Этот вопрос будет легче ответить, если вы действительно скажете, какие ошибки вы получаете.Во всяком случае, один из возможных источников проблем (кроме ошибки, упомянутой в ответе Гильерме) будет заключаться в том, являются ли 'id' и' Name' общедоступными полями в классе, которые 'TraitList' является списком. Если это не так, вам может понадобиться использовать их получатели для их извлечения. И если они есть, вы, вероятно, должны прочитать об инкапсуляции. –

+0

Добавлены ошибки с предложением Гильерме на вопрос как образ. Кроме того, я не дал классификаций, открытых или закрытых для полей в классе Trait, поэтому, я думаю, они публичные. Я прочитаю инкапсуляцию. Изучил его давным-давно, не помню его четко. – Werneck

ответ

0
new AbstractListModel() { 
    String [] values = new String []; 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
    public int getSize() { 
     return values.length; 
    } 
    public Object getElementAt(int index) { 
     return values[index]; 
    } 
} 

Это недопустимое определение анонимного класса, у вас есть код, плавающий внутри тела класса.

Это может быть исправлено либо путем перемещения инициализации к частному методу:

String [] values = initTraitList(); 
private String[] initTraitList() { 
    String [] values = new String [TraitList.size()]; 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
    return values; 
} 

или с помощью экземпляра инициализации блока:

String [] values = new String [TraitList.size()]; 
{ 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
} 
+0

Спасибо, Kiskae! Я решила свою проблему, но что-то пошло не так, когда я продолжал ее тестировать. Спасибо большое, в любом случае, это одна проблема, с которой я могу волноваться! ^^ – Werneck

+0

@Werneck Если код внезапно вызывает лавину предупреждений и ошибок, источник обычно находится в начале. Хорошая вещь, которую следует помнить при определении таких проблем. – Kiskae

+0

Просто не мог понять, как задать значения для вектора String . Возвращаемые значения: линия сделала это для меня. – Werneck

0

Я думаю, что линия

String [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 

должен быть

values[jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 

правильно?

+0

Спасибо, Гильерме, за ваш ответ! Я попробовал это, а также отметил ошибки, как спросил Дэвид Уоллес. Он находится в изображении в отредактированном вопросе. – Werneck

+0

U r приветствуется! (: –

0

Не нужно копировать список в локальную переменную. Вы можете, если хотите, но это необязательно. Вот пример доступа исходный список непосредственно в модели:

public static void main(String[] args) { 
    List<String> values = Arrays.asList("A", "B", "C"); 
    JList list = new JList(new AbstractListModel() { 
     public int getSize() { 
      return values.size(); 
     } 

     public Object getElementAt(int index) { 
      return index + " - " + values.get(index); 
     } 
    }); 
    list.addListSelectionListener(e -> 
      System.out.println("Clicked " + list.getSelectedValue())); 
    JFrame frame = new JFrame("List Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(list); 
    frame.pack(); 
    frame.setVisible(true); 
} 

Если вы особенно хотите его в массив внутри модели с индексами, внедренных в значении, то:

String[] valueCopy = IntStream.range(0, values.size()) 
    .mapToObj(i -> i + " - " + values.get(i)) 
    .toArray(new String[0]); 
public int getSize() { 
    return valueCopy.length; 
} 

public Object getElementAt(int index) { 
    return valueCopy[index]; 
} 
+0

Спасибо за ответ, спринтер. Я пометил ответ Киски как наиболее полезный, потому что мне было проще, но он также помог вам получить ваш ответ, так как он дал мне пример действия после щелчка элемента списка Спасибо! – Werneck

0

Это может быть достигнуто без модели:

String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"}; 
JList jlist = new JList(values); 
scrollpane = new JScrollPane(jlist); 
scrollpane.setViewportView(jlist); 
+0

"1 - Dante 2 - William 3 - Jaime" был всего лишь примером того, как я хотел, чтобы он отображался. Плюс я сделал это, чтобы увидеть, как Window Builder создаст JList. Кроме того, при создании JList существуют две последние строки по умолчанию. – Werneck

Смежные вопросы