java - 当其内容更改时,使状态修剪栏贡献增加
问题描述
我正在尝试添加一个 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
,然后我们添加了一个GridData
into 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
,这远远超过我想要的。另外,如果用户的字体与我的不同,标签的宽度可能会由于初始字符串而变得太大或太小。
解决方案
为我使用作品的最小宽度设置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
是违反规则的,可能会损坏其他组件的布局。
推荐阅读
- python - Spark“sum”命令给出方法 sum([class java.util.ArrayList]) 不存在
- firebase - 验证码获取不到现有号码?
- java - 尝试在命令行上运行 Java Spark 应用程序时出现 NoClassDefFoundError
- python - 如何教keras神经网络解决sqrt
- php - __construct 函数未在容器 symfony 3.4 中正确构造
- lucene - 在非索引文档/字符串中查找索引词
- spring-security - 如何在 Baeldung spring-security-registration 应用程序中配置数据库?
- javascript - 如何将“收件人”字段(在电子邮件标题中)设置为群组电子邮件地址?
- c# - 在上一个或下一个上将 ID 传递给控制器
- jenkins - 如何在jenkinsfile中将内部版本号从一个作业传递到另一个作业以进行构建作业?