Java - обновление textFields из JList - PullRequest
0 голосов
/ 26 ноября 2009

Я делаю GUI адресной книги с Java, и у меня есть JList, который отображает все имена людей в моем ArrayList (это заполняется методом updateinfo, упомянутым ниже). Я хочу, чтобы, когда я щелкаю по элементу на JList, TextField затем обновляются с указанием данных о людях. Раньше я использовал только кнопки и, следовательно, actionListeners. Я думаю, что понимаю, что JList должен использовать ListSelectionListener, но я не могу реализовать это. Я добавил фрагмент своего кода ниже. Может кто-нибудь, пожалуйста, помогите ?? Для преемственности с моим actionlisteners я хотел бы иметь его как внутренний класс, но это не жизненно важно

JList jl;
DefaultListModel list;

list = new DefaultListModel();
this.jl = new JList(this.list);
//add ListSelectionListener????
updateList();
this.add(this.jl, layout);

Ответы [ 4 ]

1 голос
/ 26 ноября 2009

Вы можете добавить слушателя, а затем просто запросить текущий выбранный индекс.

Я сделал для вас образец, надеюсь, вы найдете его полезным.

Это соответствующий раздел:

    private JComponent list() {
        final JList list =  new JList( data);
        list.addListSelectionListener(new ListSelectionListener() {
          public void valueChanged(ListSelectionEvent e) {
            int i = list.getSelectedIndex();
            nameTextField.setText( i >= 0 ? data.get( i ) : "" );
          }
        });
        return new JScrollPane( list );
    }

Помните, что это не единственный путь, это только отправная точка для вас.

Вот полный рабочий образец:

import java.util.Vector;
import java.util.Arrays;

import java.awt.BorderLayout;

import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.JComponent;

import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;

public class JListSample {

    private Vector<String> data = new Vector<String>( 
            Arrays.asList( new String []  {
                    "one", "two", "three"  
            })
    );

    private JTextField nameTextField;

    public static void main( String [] args) {
        JListSample s = new JListSample();
        s.run();
    }
    public  void run() {
        JFrame frame = new JFrame("Selection test");
        frame.add( list(), BorderLayout.WEST );
        frame.add( editPanel() );
        frame.pack();
        frame.setVisible( true );

    }

    private JComponent list() {
        final JList list =  new JList( data);
        list.addListSelectionListener(new ListSelectionListener() {
          public void valueChanged(ListSelectionEvent e) {
            int i = list.getSelectedIndex();
            nameTextField.setText( i >= 0 ? data.get( i ) : "" );
          }
        });
        return new JScrollPane( list );
    }
    private JComponent editPanel() {
        JPanel panel = new JPanel();
        panel.add(  new JLabel("Name:") );
        nameTextField = new JTextField(10);
        panel.add( nameTextField );
        return panel;
    }
}

Это то, что отображается:

образец http://img177.imageshack.us/img177/6294/capturadepantalla200911k.png

0 голосов
/ 26 ноября 2009

Мне кажется, я понимаю, что JList должен использовать ListSelectionListener, но я не могу кажется, реализовать это

Хорошо, тогда начните с чтения JList API. Вы найдете ссылку на учебник по Swing «Как использовать списки», который содержит рабочий пример.

Также в руководстве вы найдете раздел «Как написать слушатель выбора списка», который содержит второй пример.

Начните с учебника по основным вопросам.

0 голосов
/ 26 ноября 2009

Да, вы захотите использовать ListSelectionListener для этого, вы также, вероятно, захотите установить для списка одиночный выбор (ListSelectionModel.SINGLE_SELECTION). Это позволит пользователю выбрать только один элемент в списке. Затем вы можете добавить свой listSelectionListener и в valueChanged события сделать что-то вроде следующего (не точный синтаксис).

valueChanged(ListSelectionEvent e){
   int idx = e.getFirstIndex();
   int idx2 = e.getLastIndex();  //idx and idx2 should be the same if you set SingleSel
   if(idx==idx2){
     //here you can get the person detail however you have them stored.  You can get   them from the model like so,
      Object personObj = MYLIST.getModel().getElementAt(int index); 
   }


 }
0 голосов
/ 26 ноября 2009

Вы просто добавляете прослушиватель выбора в список, например:

jl.addSelectionListener(new ListSelectionListener() {

  public void valueChanged(ListSelectionEvent e) {
     // evaluate e if necessary and call a method
     // in your class to write the text in the textfield
     int selectedRow = e.getFirstIndex(); // more complicate for multiselects
     updateTextFieldWithName(selectedRow); // to be implemented
  }
});

Использование анонимного класса, как здесь, - самый быстрый способ. Это немного трудно читать, но типичный шаблон.

(только что прочитал, что вы предпочли внутренний класс, но я не могу написать это здесь на лету без IDE под рукой ...)

...