SWT调整大小错误

时间:2017-07-25 16:29:36

标签: java swt

我一直在使用SWT并且发现了一个问题。

选择和取消选中复选框并最大化窗口时,即使它为空,也会设置第一个按钮的图标。此外,按钮上的文本布局可能最终不正确。

重新创建错误:

  1. 选择复选框1
  2. 取消选中复选框1
  3. 选择复选框3
  4. 最大化窗口
  5. 复选框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();
       }
    

1 个答案:

答案 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

结果:(请注意我只更改了第一个按钮

enter image description here enter image description here