【问题标题】:Eclipse Neon and Oxygen setExtended GridLayout can't cast to FillLayoutEclipse Neon 和 Oxygen setExtended GridLayout 无法转换为 FillLayout
【发布时间】:2018-02-23 18:57:55
【问题描述】:

我有一个大插件 eclipse Indigo RCP 程序。 尝试迁移到 Oxygen 和 Java 8(从 7 开始)我遇到了关于 GridLayouts 的所有 setExpanded(false) 问题。

我收到类似于 ...GridLayout 无法转换为 FillLayout 的响应。 奇怪的是,这在 Indigo 中有效。两个版本之间的代码库没有变化。除了这个紧凑/扩展程序似乎工作。

有什么想法吗??

当然,我可以添加错误消息,但我的问题是靛蓝和氧气甚至霓虹灯和氧气之间是否存在与 setExtend 相关的变化?

有一个 2014 年的错误报告,但似乎从未得到解决。

堆栈跟踪:

!ENTRY org.eclipse.ui 4 0 2017-09-15 08:44:54.915
!MESSAGE Unhandled event loop exception
!STACK 0
    java.lang.ClassCastException: org.eclipse.swt.layout.GridData cannot be cast to org.eclipse.swt.layout.FillData
    at org.eclipse.swt.layout.FillLayout.flushCache(FillLayout.java:173)
    at org.eclipse.swt.widgets.Composite.layout(Composite.java:831)
    at org.eclipse.swt.widgets.Control.requestLayout(Control.java:2427)
    at org.eclipse.ui.forms.widgets.ExpandableComposite.reflow(ExpandableComposite.java:1139)
    at org.eclipse.ui.forms.widgets.Section.reflow(Section.java:122)
    at org.eclipse.ui.forms.widgets.ExpandableComposite.internalSetExpanded(ExpandableComposite.java:893)
    at org.eclipse.ui.forms.widgets.Section.internalSetExpanded(Section.java:108)
    at org.eclipse.ui.forms.widgets.ExpandableComposite.toggleState(ExpandableComposite.java:1068)
    at org.eclipse.ui.forms.widgets.ExpandableComposite.access$5(ExpandableComposite.java:1065)
    at org.eclipse.ui.forms.widgets.ExpandableComposite$1.linkActivated(ExpandableComposite.java:576)
    at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleActivate(AbstractHyperlink.java:213)
    at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleMouseUp(AbstractHyperlink.java:307)
    at org.eclipse.ui.forms.widgets.AbstractHyperlink.lambda$3(AbstractHyperlink.java:115)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4428)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4238)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3817)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1044)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
    at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
    at com.myCompany.rcp.console.product.Application.start(Application.java:167)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1499)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1472)

代码:

    @Override
    public void createPartControl(Composite parent) 

{
// Toolkit
FormToolkit toolkit = new FormToolkit(parent.getDisplay());
toolkit.setBorderStyle(SWT.NO);

// Base component
baseComp = toolkit.createComposite(parent);
GridLayout layout = new GridLayout();       
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.marginHeight=0;
layout.marginWidth=0;
baseComp.setLayout(layout);
baseComp.setLayoutData(new GridData(GridData.FILL_BOTH));
m_searchRoiSection = toolkit.createSection(baseComp, Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED);
m_searchRoiSection.setActiveToggleColor(toolkit.getHyperlinkGroup().getActiveForeground());
m_searchRoiSection.setToggleColor(toolkit.getColors().getColor(IFormColors.SEPARATOR));
toolkit.createCompositeSeparator(m_searchRoiSection);
layout = new GridLayout();
layout.horizontalSpacing = 0;
layout.verticalSpacing = 10;
layout.marginHeight = 0;
layout.marginWidth = 0;
m_searchRoiSection.setLayout(layout);
m_searchRoiSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
m_searchRoiSection.addExpansionListener(new ExpansionAdapter() 
{
public void expansionStateChanged(ExpansionEvent e) 
{
updateRoiSection();
}
});
m_searchRoiSection.setText("ROI");
m_searchRoiSection.setDescription("Select region of interest. Leave blank for any area.");
Composite searchRoiComp = toolkit.createComposite(m_searchRoiSection);
layout = new GridLayout();
layout.horizontalSpacing = 3;
layout.verticalSpacing = 3;
layout.marginHeight = 5;
layout.marginWidth = 5;
layout.numColumns = 3;
searchRoiComp.setLayout(layout);
// Create ROI search section contents
createRoiSearch(searchRoiComp);
m_searchRoiSection.setClient(searchRoiComp);        
m_searchRoiSection.setExpanded(false);
}               

【问题讨论】:

  • 什么是`setExtended?一方面,我不知道你在说什么。
  • 抱歉不清楚。在 org.eclipse.ui.forms.widgets 中,您可以创建可使用twistie 图标展开的部分。我使用 gridlayout 并将方法 setExpanded 设置为 false。这意味着该部分是紧凑的作为起点。我的来源是:GridLayout layout = new GridLayout(); layout.horizo​​ntalSpacing = 3;布局.verticalSpacing = 3; layout.nuColumns = 3;然后将布局添加到名为 searchComposite 的 Composite。 searchComposite.setLayout(布局);然后将此组合添加到一个部分。
  • '然后添加布局'在哪里?编辑您的问题并向我们展示正确的minimal reproducible example
  • 然后将此作文添加到一个部分。第 m_searchComposition.setClient(searchComposition);然后是神奇的 m_searchComposition.setExpanded(false);这条线在 Indigo 中工作。当迁移到氧气时,它会停止工作。转换 ...GridData 不能转换为 org.eclipse.swt.layout.Filldata 只有我没有父级作为 Filldata ....
  • 很抱歉再次不清楚我也在尝试了解stackoverflow论坛的窍门。菜鸟在这里

标签: java eclipse rcp eclipse-indigo eclipse-oxygen


【解决方案1】:

行:

baseComp.setLayoutData(new GridData(GridData.FILL_BOTH));

正在基础组合上设置布局数据。此数据由parent 控件布局使用。父控件使用FillLayout,所以GridData 不正确。您应该删除此行,因为您不需要 FillLayout 的任何布局数据。

另请注意:

layout = new GridLayout();
layout.horizontalSpacing = 0;
layout.verticalSpacing = 10;
layout.marginHeight = 0;
layout.marginWidth = 0;
m_searchRoiSection.setLayout(layout);

Section 不支持setLayout,只是忽略了这个调用。

【讨论】:

  • 你太棒了!它解决了这个问题。我不明白为什么父级使用 FillLayout 因为我无法跟踪父对象(我还不熟悉框架)。但这太神奇了!你知道为什么这在 Indigo 中有效吗?他们在 Java7 和 Java8 之间有什么改变吗?
  • 这与Java版本无关。 Eclipse 内部从 Eclipse 3 到 4 被完全重写,所以它可能与此有关。据我所知,传递给 createPartControl 的父控件一直使用 FillLayout。
  • 好的。很高兴知道。仍然很奇怪,我们在 Indigo 中使用了这么久,它现在出现了。无论如何,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2018-04-15
  • 2018-11-29
相关资源
最近更新 更多