2015-10-05 3 views
2

Мне было интересно, есть ли способ, выбрав элемент с помощью JList, чтобы программа выполняла какой-то код. Этот код должен запускаться каждый раз при выборе нового элемента.JList Выбор позиции

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

public class Driver { 

    public static void main(String[] args) { 
     JFrame frame = new ListFrame(); 
     frame.setVisible(true); 
     frame.setSize(200,100); 
    } 

} 

public class ListFrame extends JFrame { 

    private JList<String> list; 
    private JScrollPane scrollPane; 
    private String[] data = {"A","B","C"}; 
    private JButton addButton = new JButton("Add"); 

    public ListFrame() { 
     setLayout(new BorderLayout()); 

     list = new JList<String>(data); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     scrollPane = new JScrollPane(list); 

     add(scrollPane, BorderLayout.CENTER); 
     add(addButton, BorderLayout.SOUTH); 

     addButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       String newEntry = JOptionPane.showInputDialog("Add new entry."); 
       String[] tempData = new String[data.length + 1]; 
       for(int i = 0; i < data.length; i++) 
        tempData[i] = data[i]; 
       tempData[data.length] = newEntry; 
       data = tempData; 
       list = new JList<String>(data); 
       scrollPane.setViewportView(list); 
      } 

     }); 

     list.addListSelectionListener(
       new ListSelectionListener() { 

        @Override 
        public void valueChanged(ListSelectionEvent e) { 
         System.out.println("Hi"); 
        } 

     }); 
    } 
} 

Однако, когда я нажимаю элемент в Jlist, ничего не печатается.

+1

Google это приятель. Вы получите тонны ссылок –

+2

См. [Как написать List List Listener] (http://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html) и [Как использовать списки] (http: //docs.oracle.com/javase/tutorial/uiswing/components/list.html) для получения дополнительной информации – MadProgrammer

+0

Я обновил свой вопрос с дополнительной информацией. Я уже попробовал прослушиватель списка. – Halbort

ответ

3

В вашем примере используется getSelectionModel(), чтобы получить список ListSelectionModel, и он добавляет ваш слушатель непосредственно в модель выбора. Это минует ListSelectionHandler, использовано внутренне JList, которое никогда не получает шанс fireSelectionValueChanged(). Вместо этого позвольте JList добавить слушателя:

list.addListSelectionListener(new ListSelectionListener() {...} 

при нажатии элемента на JList, ничего не печатается.

Ваш новый пример печатает «Привет», когда я нажимаю пункт, но я вижу некоторые проблемы:

  • Обязательно работать на event dispatch thread.

  • Проверьте, что произошло. ListSelectionEvent.

  • Чтобы добавить элементы в список, не создайте новый JList; обновите список ListModel.

См. How to Write a List Selection Listener для больше; вот пример, который я тестировал.

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.DefaultListModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class Driver { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      JFrame frame = new ListFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.pack(); 
      frame.setVisible(true); 
     }); 
    } 

    private static class ListFrame extends JFrame { 

     private final String[] data = {"A", "B", "C"}; 
     private final DefaultListModel model = new DefaultListModel(); 
     private final JList<String> list = new JList<>(model); 
     private final JButton addButton = new JButton("Add"); 

     public ListFrame() { 
      for (String s : data) { 
       model.addElement(s); 
      } 
      list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
      add(new JScrollPane(list), BorderLayout.CENTER); 
      add(addButton, BorderLayout.SOUTH); 
      addButton.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 
        String newEntry = JOptionPane.showInputDialog("Add new entry."); 
        model.addElement(newEntry); 
       } 
      }); 
      list.addListSelectionListener(new ListSelectionListener() { 

       @Override 
       public void valueChanged(ListSelectionEvent e) { 
        if (!e.getValueIsAdjusting()) { 
         System.out.println(e.getFirstIndex() + " " + e.getLastIndex()); 
        } 
       } 
      }); 
     } 
    } 
} 
+0

Я добавил минимальный пример. Не могли бы вы снова взглянуть на вопрос. – Halbort

+1

Большое вам спасибо. Извините, я так долго реагировал. – Halbort