Порядок слушателей в Java

Я написал свой собственный редактор ячеек таблицы, который расширяет AbstractCellEditor и реализует TableCellEditor, ItemListener и 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);
}

person BJ Dela Cruz    schedule 30.09.2011    source источник
comment
Почему бы не сделать все в ItemListener? Тогда порядок будет определяться порядком методов, вызываемых внутри itemStateChanged.   -  person Hovercraft Full Of Eels    schedule 30.09.2011
comment
Это, вероятно, зависит от того, какой слушатель выбрасывается, когда, в каком потоке и что еще происходит в то время .... краткий ответ, вероятно, нет.   -  person BenCole    schedule 30.09.2011
comment
@Hovercraft Full Of Eels: Может быть, потому что вы не можете узнать там номер строки. Или, может быть, вы можете получить его, используя ItemEvent.getItem(), понятия не имею, что Object он возвращает.   -  person maaartinus    schedule 30.09.2011
comment
Возможно, вам следует объяснить свое требование, а не свое решение. Я уверен, что есть лучшие подходы. Я даже не уверен, как генерируется ItemEvent, когда вы нажимаете на строку. Опубликуйте свой SSCCE.   -  person camickr    schedule 30.09.2011
comment
не заставляйте ваш редактор делать что-либо за его пределами. Он предназначен для того, чтобы сосредоточиться, ну, на редактировании одного значения, которое ему дано, и сообщить, когда оно будет готово. Ничего больше.   -  person kleopatra    schedule 01.10.2011
comment
Я изменил весь свой подход и вместо этого использовал ActionListener, чтобы делать то, что мне нужно было делать. Спасибо за ваши комментарии, ребята!   -  person BJ Dela Cruz    schedule 07.10.2011


Ответы (4)


Вот хорошая статья, объясняющая отсутствие порядка уведомлений слушателей в свинг: Качайся в лучшем мире

person Fredrik LS    schedule 30.09.2011
comment
Страница больше не существует - person Tralamy; 29.12.2020

Я столкнулся с подобной проблемой и только что написал этот класс. Это составной прослушиватель действий, в котором прослушиватели действий имеют приоритеты. Первыми вызываются более высокие приоритеты. Он не является общим и применяется только к слушателям действий.

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

}
person Nicolas Couture-Grenier    schedule 05.04.2014

В идеале вы не должны пытаться получить номер редактируемой строки внутри редактора. Как только пользователь закончит редактирование в редакторе и перейдет к другой ячейке, JTable получит текущее значение в редакторе с помощью метода getCellEditorValue(), а затем вызовет setValueAt(Object aValue, int rowIndex, int columnIndex) в табличной модели. Поэтому может быть лучше обрабатывать все, что относится к строке, в методе setValueAt().

person Ashwinee K Jha    schedule 30.09.2011

Вы не можете зависеть от порядка активации событий, но вы можете< /em> пересылать события по мере необходимости. В этом случае не пытайтесь определить строку в таблице ItemListener. Вместо этого позвольте CellEditor завершить и использовать новое значение для обновления модели, как было предложено здесь.

person trashgod    schedule 30.09.2011