首页 > 解决方案 > 当其内容更改时,使状态修剪栏贡献增加

问题描述

我正在尝试添加一个 Eclipse 状态修剪栏贡献,其中贡献的内容(即子元素的文本)动态变化。请注意,我并没有尝试将"line, column"信息添加到状态栏中。

理想情况下,贡献的宽度应该适应其内容的宽度,有点像 VSCode 中发生的事情:

在此处输入图像描述 在此处输入图像描述

但是,如果这不容易实现,可接受的替代方法是为状态修剪栏设置一个“固定”宽度,甚至为每个孩子设置一个固定宽度(因为我不打算让孩子出现和消失) .

以下是我尝试过的。如果过去 2 天我没有尝试任何方法,你认为我应该怎么做?

如果您认为问题实际上可能是 Eclipse 错误,请注意我2021-06 (4.20.0)在 Linux 上使用的是 Eclipse 版本。


我试过的

我有这个plugin.xml

<extension
    point="org.eclipse.ui.menus">
    <menuContribution
        locationURI="toolbar:org.eclipse.ui.trim.status">
        <toolbar
            id="some.package.StatusTrimBarContribution">
            <control
                class="some.package.StatusTrimBarContribution">
            </control>
        </toolbar>
    </menuContribution>
</extension>

我已经尝试过至少 4 种不同的方式来做到这一点。作为参考,这里是类StatusTrimBarContribution

public class StatusTrimBarContribution extends WorkbenchWindowControlContribution {
    // A
    private static String currText = /* see below */;

    private Label m_lbl = null;
    private Label m_lbl2 = null;
    private Control m_root = null;

    public StatusTrimBarContribution() {
        // Register to String event
    }

    @Override
    public void dispose() {
        // Unregister from String event
    }

    @Override
    protected Control createControl(Composite parent) {
        // B
    }

    @Subscribe // From guava
    private void someEventHandler(String event) {
        currText = "lp_much_longer";
        if (m_lbl != null) {
            m_lbl.setText();
            m_root.getParent().requestLayout();
        }
    }
}

尝试#1

在这个尝试中,我们Composite在标签 和 之间添加了一个中介parent,我们在中介上使用了 a GridLayout,然后我们添加了一个GridDatainto m_lbl

// A
private static String currText = "empty";

// B
@Override
protected Control createControl(Composite parent) {
    GridLayout gl = new GridLayout(2, false);
    Composite comp = new Composite(parent, SWT.NONE);
    comp.setLayout(gl);
    m_lbl = new Label(comp, SWT.RIGHT);
    m_lbl.setText(currText);
    GridDataFactory.defaultsFor(m_lbl).hint(200, SWT.DEFAULT).applyTo(m_lbl);
    m_lbl2 = new Label(comp, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = comp;
    return comp;
}

结果是标签太高而被截断。请注意,我还尝试将边距高度设置为 0,虽然它比下面的要好,但标签仍然会被截断。

在此处输入图像描述

尝试#2

与 #1 相比,我们移除了中介Composite,而是直接在parent. 此外,我们删除GridData, 因为,在这一点上,为什么不呢。

// A
private static String currText = "empty";

// B
@Override
protected Control createControl(Composite parent) {
    GridLayout gl = new GridLayout(2, false);
    parent.setLayout(gl);
    m_lbl = new Label(parent, SWT.RIGHT);
    m_lbl.setText(currText);
    m_lbl2 = new Label(parent, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = m_lbl;
    return m_lbl;
}

结果与以前相同,除了另外,它m_lbl不足以容纳文本:

在此处输入图像描述

尝试#3

与 #2 相比,我们额外删除了布局。

// A
private static String currText = "empty";

// B
@Override
protected Control createControl(Composite parent) {
    m_lbl = new Label(parent, SWT.RIGHT);
    m_lbl.setText(currText);
    m_lbl2 = new Label(parent, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = m_lbl;
    return m_lbl;
}

标签不再太高,但是标签的宽度对于文本来说仍然太小:

在此处输入图像描述

尝试#4

与 #3 相比,我们最初将一个很长的字符串分配给m_lbl.

// A
// Yes, this is ridiculous
private static String currText = " ".repeat(60);

// B
@Override
protected Control createControl(Composite parent) {
    m_lbl = new Label(parent, SWT.RIGHT);
    m_lbl.setText(currText);
    m_lbl2 = new Label(parent, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = m_lbl;
    return m_lbl;
}

结果是两个标签都完全可见,但现在m_lbl2与 具有相同的宽度m_lbl,这远远超过我想要的。另外,如果用户的字体与我的不同,标签的宽度可能会由于初始字符串而变得太大或太小。

在此处输入图像描述

标签: javaeclipseswt

解决方案


为我使用作品的最小宽度设置GridData

  @Override
  protected Control createControl(final Composite parent)
  {
    final Composite comp = new Composite(parent, SWT.NONE);
    GridLayoutFactory.fillDefaults().numColumns(2).applyTo(comp);

    m_lbl = new Label(comp, SWT.RIGHT);
    m_lbl.setText("label 1");

    GridDataFactory.fillDefaults().grab(true, false).minSize(200, SWT.DEFAULT).applyTo(m_lbl);

    m_lbl2 = new Label(comp, SWT.RIGHT);
    m_lbl2.setText("lbl2");

    GridDataFactory.fillDefaults().grab(true, false).minSize(100, SWT.DEFAULT).applyTo(m_lbl2);

    m_root = comp;

    return comp;
  }

注意:更改布局parent是违反规则的,可能会损坏其他组件的布局。


推荐阅读