我一直在使用SWT,并发现了一个问题。
当选择和取消选中复选框并最大化窗口时,它将导致设置第一个按钮的图标,即使它是空的。此外,按钮上的文本布局可能会导致错误。
要重新创建错误,请执行以下操作:
复选框1的图标应该为空(空),但它有交叉图标。
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();
}发布于 2017-07-26 20:19:04
无论如何,这并不理想,但如果您需要解决办法,您可以尝试的一件事是包装Button,并使用StackLayout在启用的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方法的更改:
public static void main(final String[] args) {
// ...
new Label(s, SWT.NONE).setText("C");
final Button c = new Button(s, SWT.CHECK);
new Label(s, SWT.NONE).setText("L1");
final MyButton b = new MyButton(s, "Button 1");
// ...
c.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
b.setEnabled(!b.isEnabled());
}
});
// ...
}结果:(注意我只更改了第一个按钮)


https://stackoverflow.com/questions/45308920
复制相似问题