Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中侦听器的顺序_Java_Swing_Listeners - Fatal编程技术网

Java中侦听器的顺序

Java中侦听器的顺序,java,swing,listeners,Java,Swing,Listeners,我编写了自己的表格单元格编辑器,它扩展了AbstractCellEditor,实现了TableCellEditor、ItemListener和MouseListener。有没有办法在itemStateChanged方法之前先执行mouseClicked方法?我正在努力做到以下几点: private int rowClicked; private JTable table; public void itemStateChanged(ItemEvent e) { if (rowClicked

我编写了自己的表格单元格编辑器,它扩展了
AbstractCellEditor
,实现了
TableCellEditor
ItemListener
MouseListener
。有没有办法在
itemStateChanged
方法之前先执行
mouseClicked
方法?我正在努力做到以下几点:

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

下面是一篇很好的文章,解释了swing中没有侦听器通知顺序的原因:

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

您不能依赖它,但可以根据需要转发事件。在这种情况下,不要试图确定
itemstener
中的行。相反,让
CellEditor得出结论,并按照建议使用新值更新模型。

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

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

}
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.Map;
导入java.util.TreeMap;
导入java.util.TreeSet;
公共类CompositeActionListenerWithPriorities实现ActionListener{
专用映射侦听器=
新树映射();
@凌驾
已执行的公共无效操作(操作事件e){
树集=新树集();
t、 addAll(listeners.keySet());
迭代器it=t.DegendingIterator();
while(it.hasNext()){
int x=it.next();
ArrayList l=listeners.get(x);
for(ActionListener a:l){
a、 已采取的行动(e);
}
}
}
公共布尔deleteActionListener(ActionListener a){
for(整数x:listeners.keySet()){

对于(int i=0;我为什么不在ItemListener中执行所有操作?然后,顺序将由itemStateChanged内部调用的方法的顺序决定。这可能取决于在何时、在什么线程上抛出哪个侦听器,以及当时发生了什么事……简短的回答,可能不是。@Hovercraft Full Eels:可能是因为您找不到行号。或者,您可以使用
ItemEvent.getItem()获取它
,不知道它返回的对象是什么。也许你应该解释你的需求,而不是你的解决方案。我确信有更好的方法。我甚至不知道当你点击一行时ItemEvent是如何生成的。发布你的SSCE。不要让你的编辑器在自身之外做任何事情。它的设计目的是集中于编辑一个值当它准备好的时候,你会得到它并报告回来。没有其他东西。这个页面已经不存在了