2017-07-25 65 views
4

我一直在使用SWT並發現問題。SWT調整大小錯誤

選擇和取消選中複選框並最大化窗口時,即使它爲空,也會導致設置第一個按鈕的圖標。此外,按鈕上文本的佈局可能會不正確。

重現該錯誤:

  1. 選擇複選框1
  2. 取消複選框1
  3. 選擇複選框3
  4. 最大化窗口

的複選框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(); 
    } 
+0

在MacOS 10.12.6不可重複使用SWT來自Eclipse Oxygen。 –

+0

我在Windows 7上使用Eclipse 3.4。 – Michael

+0

Eclipse 3.4是古老的,很可能從那時起它已經被修復了。嘗試使用[這裏]的SWT jar(http://download.eclipse.org/eclipse/downloads/drops4/R-4.7-201706120950/) –

回答

1

這是不以任何方式理想,但如果你需要一個解決辦法,有一兩件事你可以嘗試披着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()); 
     } 
    }); 

    // ... 

} 

結果:(注意,我只改第一個按鈕

enter image description here enter image description here