Java中的侦听器顺序

BJ *_*ruz 5 java swing listeners

我编写了自己的表格单元格编辑器,用于扩展AbstractCellEditor和实现a TableCellEditor,an ItemListener和a MouseListener.有没有办法让mouseClicked方法在itemStateChanged方法之前先执行?我正在尝试执行以下操作:

private int rowClicked;
private JTable table;

public void itemStateChanged(ItemEvent e) {
  if (rowClicked == 5) {
    // Do something to row 5.
  }
}

public void mouseClicked(MouseEvent e) {
  Point p = e.getPoint();
  rowClicked = table.rowAtPoint(p);
}
Run Code Online (Sandbox Code Playgroud)

Fre*_* LS 9

这是一篇很好的文章,解释了摇摆中没有听众通知顺序:在一个更美好的世界中摇摆

  • 该页面已不存在 (2认同)

Nic*_*ier 5

我遇到了类似的问题,刚刚写了这个类。它是一个复合动作监听器,其中动作监听器具有优先级。优先级较高的会先被调用。它不是通用的,仅适用于动作侦听器。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;

public class CompositeActionListenerWithPriorities implements ActionListener {
  private Map<Integer, ArrayList<ActionListener>> listeners = 
      new TreeMap<Integer,ArrayList<ActionListener>>();


  @Override
  public void actionPerformed(ActionEvent e) {
    TreeSet<Integer> t = new TreeSet<Integer>();
    t.addAll(listeners.keySet());
    Iterator<Integer> it = t.descendingIterator();
    while(it.hasNext()){
      int x = it.next();
      ArrayList<ActionListener> l = listeners.get(x);
      for(ActionListener a : l){
        a.actionPerformed(e);
      }
    }
  }
  public boolean deleteActionListener(ActionListener a){
    for(Integer x : listeners.keySet()){
      for(int i=0;i<listeners.get(x).size();i++){
        if(listeners.get(x).get(i) == a){
          listeners.get(x).remove(i);
          return true;
        }
      }
    }
    return false;
  }
  public void addActionListener(ActionListener a, int priority){
    deleteActionListener(a);
    if(!listeners.containsKey(priority)){
      listeners.put(priority,new ArrayList<ActionListener>());
    }
    listeners.get(priority).add(a);
  }

}
Run Code Online (Sandbox Code Playgroud)