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。不要让你的编辑器在自身之外做任何事情。它的设计目的是集中于编辑一个值当它准备好的时候,你会得到它并报告回来。没有其他东西。这个页面已经不存在了