MVC+ SWING 和 ListSelectionListener

MVC+ SWING and a ListSelectionListener

我想做的是从我的 SWING 视图 JList 中获取选定的值到我的控制器 class,这样我就可以在我的控制器中使用该数据。 为简单起见,我手动向我的 JList("Item 1"、"Item 2" 添加了 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);
    }
}

还有一个控制器:

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。我似乎无法理解它。这也打印了 Foo 3 次,我也不知道为什么。

提前致谢

How to Write a List Selection Listener more than one ListSelectionEvent所示,当用户先选择一个条目然后再选择另一个时,可能会生成How to Write a List Selection Listener more than one ListSelectionEvent。尝试检查选择何时稳定。

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