Заказ слушателей на Яве - PullRequest
5 голосов
/ 30 сентября 2011

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

Ответы [ 4 ]

9 голосов
/ 30 сентября 2011

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

4 голосов
/ 05 апреля 2014

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

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

}
2 голосов
/ 01 октября 2011

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

2 голосов
/ 30 сентября 2011

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

...