我一直在使用SWT并且发现了一个问题。
选择和取消选中复选框并最大化窗口时,即使它为空,也会设置第一个按钮的图标。此外,按钮上的文本布局可能最终不正确。
重新创建错误:
复选框1的图标应为null(空),而是具有十字图标。
public static void main(String[] args) {
final Display d = new Display();
Shell s = new Shell(d);
s.setLayout(new GridLayout(2, false));
s.setSize(500, 500);
new Label(s, SWT.NONE).setText("C");
final Button c = new Button(s, SWT.CHECK);
new Label(s, SWT.NONE).setText("L1");
final Button b = new Button(s, SWT.PUSH | SWT.FLAT);
b.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
b.setText("Button 1");
b.setEnabled(false);
new Label(s, SWT.NONE).setText("C2");
final Button c2 = new Button(s, SWT.CHECK);
new Label(s, SWT.NONE).setText("L2");
final Button b2 = new Button(s, SWT.PUSH | SWT.FLAT);
b2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
b2.setImage(null);
b2.setText("Button 2");
b2.setEnabled(false);
new Label(s, SWT.NONE).setText("C3");
final Button c3 = new Button(s, SWT.CHECK);
new Label(s, SWT.NONE).setText("L3");
final Button b3 = new Button(s, SWT.PUSH | SWT.FLAT);
b3.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
b3.setText("Button 3");
b3.setEnabled(false);
c.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!b.isEnabled()) {
b.setImage(d.getSystemImage(SWT.ICON_ERROR));
b.setEnabled(true);
} else {
b.setImage(null);
b.setEnabled(false);
}
}
});
c2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!b2.isEnabled()) {
b2.setImage(d.getSystemImage(SWT.ICON_ERROR));
b2.setEnabled(true);
} else {
b2.setImage(null);
b2.setEnabled(false);
}
}
});
c3.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!b3.isEnabled()) {
b3.setImage(d.getSystemImage(SWT.ICON_ERROR));
b3.setEnabled(true);
} else {
b3.setImage(null);
b3.setEnabled(false);
}
}
});
s.open();
while (!s.isDisposed()) {
if (!d.readAndDispatch())
d.sleep();
}
d.dispose();
}
答案 0 :(得分:1)
这无论如何都不是理想的,但是如果你需要一个解决方法,你可以尝试的一件事是包裹Button
并使用StackLayout
在启用的{{1}之间翻转}和已禁用的Button
。这样您就不会添加/删除Button
。这也解决了布局问题,因为实际的Image
实例没有改变状态。
例如:
Button
同样,这不是理想的,但您始终可以将方法(public static class MyButton {
private final Button buttonEnabled;
private final Button buttonDisabled;
private final Composite stackComposite;
private final StackLayout stackLayout;
public MyButton(final Composite parent, final String text) {
stackComposite = new Composite(parent, SWT.NONE);
stackLayout = new StackLayout();
stackComposite.setLayout(stackLayout);
stackComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
buttonEnabled = createButton(stackComposite, text, true);
buttonDisabled = createButton(stackComposite, text, false);
stackLayout.topControl = buttonEnabled;
}
public void setEnabled(final boolean enabled) {
stackLayout.topControl = enabled ? buttonEnabled : buttonDisabled;
stackComposite.layout();
}
public boolean isEnabled() {
return stackLayout.topControl.equals(buttonEnabled) ? true : false;
}
private static Button createButton(final Composite parent,
final String text, final boolean enabled) {
final Button button = new Button(parent, SWT.PUSH | SWT.FLAT);
button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
button.setText(text);
button.setEnabled(enabled);
if (enabled) {
button.setImage(parent.getDisplay().getSystemImage(SWT.ICON_ERROR));
}
return button;
}
}
等)添加到addListener(...)
类,以便在启用的MyButton
上调用方法,现在只是一个实现细节。
对Button
方法的更改:
main
结果:(请注意我只更改了第一个按钮)