2016-01-12 2 views
1

То, что я пытаюсь сделать, это получить выбранное значение из моего SWING View JList в мой класс контроллера, поэтому я могу использовать эти данные в своем контроллере. Для простоты я вручную добавил 2 элемента в свой JList («Item 1», «Item 2», (так что мне нужно что-то передать) У меня, кажется, есть проблема с его доступом. My View имеет JList с ListSelectionListener, который я передаю на мой контроллер через мой основной:MVC + SWING и ListSelectionListener

public class AppMain { 

    private AppView appView = null; 

    public static void main(String[] args) { 
     AppView appView = new AppView(); 
     Controller controller = new Controller(appView); 
    } 

    public AppView getView() { 
     return appView; 
    } 
} 

мой взгляд:

import javax.swing.event.ListSelectionListener; 

public class AppView extends javax.swing.JFrame { 

public AppView() { 
    initComponents(); 
    this.setVisible(true); 
} 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    jScrollPane1 = new javax.swing.JScrollPane(); 
    ValueList = new javax.swing.JList(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    ValueList.setModel(new javax.swing.AbstractListModel() { 
     String[] strings = { "Item 1", "Item 2", " " }; 
     public int getSize() { return strings.length; } 
     public Object getElementAt(int i) { return strings[i]; } 
    }); 
    jScrollPane1.setViewportView(ValueList); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(75, 75, 75) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(63, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(45, 45, 45) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(27, Short.MAX_VALUE)) 
    ); 

    pack(); 
}// </editor-fold>       

// Variables declaration - do not modify      
private javax.swing.JList ValueList; 
private javax.swing.JScrollPane jScrollPane1; 
// End of variables declaration     
public void ListSelectionListener(ListSelectionListener selectionListener) { 
     ValueList.addListSelectionListener(selectionListener); 
    } 
} 

и контроллер:

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

public class Controller implements ListSelectionListener{ 

    AppView gui; 
    public Controller(AppView v) 
    { 
    gui = v; 
    gui.ListSelectionListener(this); 
    } 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
    this.gui.ListSelectionListener(this); 
    System.out.println("FOO");  
    } 
} 

Нет, я хочу, чтобы получить SelectedValue я n Контроллер. Кажется, я не понимаю. Также это печатает Foo 3 раза, и я также не могу понять, почему.

Заранее спасибо

ответ

2

Как показано на How to Write a List Selection Listener более одного ListSelectionEvent может генерироваться, как пользователь выбирает кулак одну запись, а затем другую. Попробуйте проверить, когда выбор стабилен.

if (!e.getValueIsAdjusting()) { 
    // examine result 
    ListSelectionModel lsm = (ListSelectionModel)e.getSource(); 
    int minIndex = lsm.getMinSelectionIndex(); 
    int maxIndex = lsm.getMaxSelectionIndex(); 
    … 
} 
+0

Поскольку это устраняет проблему наличия нескольких 'ListSelectionEvents' Другая проблема, которую я описал, до сих пор остается неопределенной для меня. Как получить значение из моего списка просмотра для моего контроллера. – Nina

+0

Демо использует 'e.getSource()' для получения модели запуска и выбранного индекса. – trashgod

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