5

我编写了自己的表格单元格编辑器,它扩展AbstractCellEditor并实现了 a TableCellEditor、 anItemListener和 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);
}
4

4 回答 4

8

这是一篇很好的文章,解释了 Swing 中缺少侦听器通知顺序: Swing in a better world

于 2011-09-30T17:15:23.967 回答
4

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

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);
  }

}
于 2014-04-05T16:11:30.663 回答
2

理想情况下,您不应尝试在编辑器中获取正在编辑的行号。一旦用户在编辑器中完成编辑并移动到另一个单元格,JTable 将使用getCellEditorValue()方法在编辑器中获取当前值,然后 在表模型上调用setValueAt(Object aValue, int rowIndex, int columnIndex) 。因此,在setValueAt()方法中处理特定于行的任何内容可能会更好。

于 2011-09-30T19:21:58.033 回答
2

不能依赖事件触发顺序,但可以根据需要转发事件。在这种情况下,不要尝试确定ItemListener. 相反,让我们CellEditor得出结论,并使用新值来更新模型,如此处所建议

于 2011-09-30T22:50:20.750 回答