MVC&x2B;SWING和ListSelectionListener

MVC&x2B;SWING和ListSelectionListener,swing,model-view-controller,jlist,selectedvalue,Swing,Model View Controller,Jlist,Selectedvalue,我试图做的是从我的SWING视图JList中获取所选的值到我的控制器类,这样我就可以在控制器中使用这些数据。 为了简单起见,我手动将两个元素添加到我的JList(“项目1”、“项目2”(因此我有一些东西要传递),我似乎在访问它时遇到了问题。我的视图有一个JList,带有一个ListSelectionListener,我通过我的main将其传递给我的控制器: public class AppMain { private AppView appView = null; publi

我试图做的是从我的SWING视图
JList
中获取所选的值到我的控制器类,这样我就可以在控制器中使用这些数据。 为了简单起见,我手动将两个元素添加到我的JList(“项目1”、“项目2”(因此我有一些东西要传递),我似乎在访问它时遇到了问题。我的视图有一个
JList
,带有一个
ListSelectionListener
,我通过我的main将其传递给我的控制器:

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);
    }
}
不,我想在控制器中获取selectedValue。我似乎无法掌握它。而且这会打印
Foo
3次,我也无法找到原因

如中所示,当用户先选择一个条目,然后再选择另一个条目时,可能会生成多个条目。请在选择稳定时尝试检查

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

由于这确实解决了拥有多个
ListSelectionEvents
的问题,我描述的另一个问题对我来说仍然很模糊。如何从我的视图列表中获取值到我的控制器。演示使用
e.getSource()
获取触发模型和所选索引。
if (!e.getValueIsAdjusting()) {
    // examine result
    ListSelectionModel lsm = (ListSelectionModel)e.getSource();
    int minIndex = lsm.getMinSelectionIndex();
    int maxIndex = lsm.getMaxSelectionIndex();
    …
}