Java JFace MasterDetailsPart-未显示详细信息页面
我第一次使用JFace MasterDetailsPart时遇到了一些问题。“详细信息”页面未显示-当我选择一个新项目时,不会触发该事件。 我找不到任何好的例子或教程,甚至JavaDoc也帮不了我 detailspart在初始化时只实现IDetailsPart和SYSOUT的一条消息(如图所示),但标签未显示:以下是detailspart代码:Java JFace MasterDetailsPart-未显示详细信息页面,java,eclipse,swt,rcp,jface,Java,Eclipse,Swt,Rcp,Jface,我第一次使用JFace MasterDetailsPart时遇到了一些问题。“详细信息”页面未显示-当我选择一个新项目时,不会触发该事件。 我找不到任何好的例子或教程,甚至JavaDoc也帮不了我 detailspart在初始化时只实现IDetailsPart和SYSOUT的一条消息(如图所示),但标签未显示:以下是detailspart代码: public class Einzelansicht implements IDetailsPage{ public Einzelansich
public class Einzelansicht implements IDetailsPage{
public Einzelansicht() {
// TODO Auto-generated constructor stub
}
@Override
public void commit(boolean arg0) {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void initialize(IManagedForm arg0) {
System.out.println("initialize");
}
@Override
public boolean isDirty() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isStale() {
// TODO Auto-generated method stub
return false;
}
@Override
public void refresh() {
// TODO Auto-generated method stub
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
@Override
public boolean setFormInput(Object arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public void selectionChanged(IFormPart arg0, ISelection arg1) {
System.out.println("!!");
}
@Override
public void createContents(Composite arg0) {
arg0.setLayout(new GridLayout());
Label label = new Label(arg0, 0);
label.setText("Einzel");
}
}
我想这很简单,没有什么特别的东西会失败。现在我的主过道锁:
public class BlockZwei extends MasterDetailsBlock {
private FormToolkit toolkit;
private IManagedForm form;
/**
* Create the master details block.
*/
public BlockZwei() {
// Create the master details block
}
/**
* Create contents of the master details block.
*
* @param managedForm
* @param parent
*/
@Override
protected void createMasterPart(final IManagedForm managedForm,
Composite parent) {
toolkit = managedForm.getToolkit();
//
form = managedForm;
final TableViewer tableViewer = new TableViewer(parent);
ArrayContentProvider arrayContent = ArrayContentProvider.getInstance();
tableViewer.setContentProvider(arrayContent);
String[] strings = new String[] { "Eins", "Zwei" };
tableViewer.setInput(strings);
tableViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent arg0) {
managedForm.fireSelectionChanged(detailsPart, arg0.getSelection());
}
});
}
/**
* Register the pages.
*
* @param part
*/
@Override
protected void registerPages(DetailsPart part) {
part.registerPage(Einzelansicht.class, new Einzelansicht());
}
如您所见,我向选择注册了一个侦听器,据我所知,该事件应该触发detailspage上的事件。
最后但并非最不重要的一点是,我的ViewPart使用MDB
public class View extends ViewPart {
public static final String ID = "EclipseRCPStinkt.view";
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
public void createPartControl(Composite parent) {
ManagedForm managed = new ManagedForm(parent);
BlockZwei block = new BlockZwei();
block.createContent(managed);
managed.refresh();
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
}
}
我忘了打电话了吗?我真的找不到我的错误我也有同样的问题,并且没有太多关于如何在eclipse中实现MasterDetails模式的在线资源。我来过这里,但不幸的是还没有人回答,所以我不得不自己调查。我主要尝试分析
plugin.xml
文件的eclipse编辑器的extensionPage
类。一般来说,我对Eclipse和Java都很熟悉,所以不要把我的答案看作是oracle,但因为没有其他答案,所以它可能对您有一些用处
使用调试器,您会注意到在注册页面时会调用方法initialize()
,因此它不依赖于当前选择
我的MasterDetailsBloc类是这样的:
public class MyMasterDetailsBlock extends MasterDetailsBlock{
private SectionPart fMasterSectionPart;
private Section fMasterSection;
private TreeViewer fTreeViewer;
[...]
/**
* Create contents of the master details block.
* @param managedForm
* @param parent
*/
@Override
protected void createMasterPart(IManagedForm managedForm, Composite parent) {
fMasterSection = managedForm.getToolkit().createSection(parent,
ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR);
fMasterSectionPart = new SectionPart(fMasterSection, 0);
Composite composite = new Composite(fMasterSection, SWT.RIGHT);
fTreeViewer = new TreeViewer(composite, SWT.FILL);
fTreeViewer.setContentProvider(new MyContentProvider());
fTreeViewer.setLabelProvider(new MyLabelProvider());
fTreeViewer.setInput(fMyInput);
fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
detailsPart.selectionChanged(fMasterSectionPart,
event.getSelection());
}
);
[...]
}
/**
* Register the pages.
* @param part
*/
@Override
protected void registerPages(DetailsPart part) {
part.registerPage(MyClass.class, new MyClassDetailsPage());
}
[...]
}
技巧似乎是,您需要创建一个SectionPart
来包装主部分
小部件(在我的代码中,它们分别是fMasterSectionPart
和fMasterSection
,在函数createMasterPart()
中初始化)。然后,您需要向查看器添加一个ISelectionChangedListener
对象,在其中调用detailsPart.selectionChanged()
,瞧。注册页面很直观,但我注意到必须分别注册每个类,即注册基类对派生类不起作用。然而,这只是第一次观察,我还没有深入研究其机制
这可能是一个丑陋肮脏的解决方案,“你不应该这样做”。尽管如此,这是我唯一能让它工作的方法,而且网上也没有关于如何正确工作的资料。我希望我能帮忙