所有相关的
使用JFace TableViewer
,我想通过单击选择一些条目(例如选择文件),然后通过双击执行一些其他操作(例如进入目录)。
通过网页注意addSelectionChangedListener()
和addDoubleClickListener()
:http://javafact.com/2010/08/07/example-tableviewer-events/,我为SelectionChangedListener
添加DoubleClickListener
和TableViwer
,并找出:
两个听众中的任何一个都可以工作,但是它们不能一起工作 - 实际上它是DoubleClickListener
无法工作的。
有什么问题?我应该如何实现单击和双击的监听器? 任何评论表示赞赏。
关于代码: 我创建了一个tableViewer,并希望显示文件系统结构。 预期的行为:用户可以双击目录条目,tableViewer将显示所选目录的结构;用户通过单击选择一个通用文件。对于其他操作,将显示警告消息对话框。
以下是与事件处理程序相关的代码。
tableView.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) tableView.getSelection();
File selFile = (File) sel.getFirstElement();
if(selFile != null){
if (selFile.isDirectory()) {
MessageDialog.openWarning(getShell(), "Warning", "You select a directory");
return;
}
System.out.println("Selected : "+ selFile.getAbsolutePath());
selectFileName = selFile.getAbsolutePath();
}
}
});
tableView.addDoubleClickListener( new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent arg0) {
Object selected;
IStructuredSelection selection = (IStructuredSelection) tableView.getSelection();
if (selection.size() != 1) return;
selected = selection.getFirstElement();
File file = (File) selected;
if (file.isFile()) {
MessageDialog.openInformation(getShell(),"Warning", "You double-clicks a generic file");
return;
}
if (file.isDirectory()) {
System.out.println("Clicked direcotry: " + file.getAbsolutePath());
//applyNewDirectory(file);
}
}
});
问候&谢谢 Sunzen
答案 0 :(得分:0)
(prolog:仍然在这里与JFace / SWT合作,所以这可能是某些人感兴趣的)
问题是API允许你这样做,但它不起作用(哦SWT ......)。 您不能在TableView上同时拥有两个侦听器,因为SelectionChangedListener将始终抓取单击并使用该事件。
解决方案是将SelectionChangedListener附加到基础表,将DoubleClickListener附加到 TableViewer 。 这样你可以同时拥有两个,例如:
table.addSelectionChangedListener(new ISelectionChangedListener(...));
tableViewer.addDoubleClickListener(new IDoubleClickListener(...));