我正在开发一个目前有2个视图的Eclipse插件。在我的第一个视图中,我有一个显示在TableViewer
(名称和连接状态)中的连接列表。在我的第二个视图中,我想在数据库(连接)中加载表。此加载将通过单击连接上的菜单项(“查看详细信息”)来完成。这些表格将显示在TreeViewer
中,因为它们也可以有孩子。我试过这样做:
我的观点课程:
public class DBTreeView extends ViewPart {
private TreeViewer treeViewer;
private Connection root = null;
public DBTreeView() {
Activator.getDefault().setDbTreeView(this);
}
public void createPartControl(Composite parent) {
treeViewer = new TreeViewer(parent);
treeViewer.setContentProvider(new DBTreeContentProvider());
treeViewer.setLabelProvider(new DBTreeLabelProvider());
}
public void setInput(Connection conn){
root = conn;
treeViewer.setInput(root);
treeViewer.refresh();
}
}
我创建了一个setInput
方法,该方法是从连接视图中的菜单项注册的操作调用的,当前所选连接作为参数:
MViewContentsAction类:
public void run(){
selectedConnection = Activator.getDefault().getConnectionsView().getSelectedConnection();
Activator.getDefault().getDbTreeView().setInput(selectedConnection);
}
在我的ContentProvider类中:
public Object[] getChildren(Object arg0) {
if (arg0 instanceof Connection){
return ((Connection) arg0).getTables().toArray();
}
return EMPTY_ARRAY;
}
其中EMPTY_ARRAY是......空数组
我面临的问题是,在调试模式下,这段代码不会以某种方式执行:
Activator.getDefault().getDbTreeView().setInput(selectedConnection);
单击菜单项时,树视图中也没有任何反应。有任何想法吗? 谢谢
答案 0 :(得分:1)
咦。好吧,你在这里做的是......不是真的正确的方式。您应该做的是将TableViewer注册为选择提供者。
getSite().setSelectionProvider(tableViewer);
然后,定义一个选择侦听器并使用树查看器将其添加到视图中,如下所示:
ISelectionListener listener = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart part, ISelection sel) {
if (!(sel instanceof IStructuredSelection))
return;
IStructuredSelection ss = (IStructuredSelection) sel;
// rest of your code dealing with checking whether selection is what is
//expected and if it is, setting it as an input to
//your tree viewer
}
};
public void createPartControl(Composite parent) {
getSite().getPage().addSelectionListener(listener);
}
现在您的树查看器的输入将根据表查看器中的内容进行更改(顺便说一下,在设置新输入后不要忘记调用treeviewer.refresh())。
查看示例here。