2017-07-25 1 views
4

J'ai utilisé SWT et j'ai trouvé un problème.SWT Resize Error

Lors de la sélection et de la désélection des cases à cocher et de l'agrandissement de la fenêtre, l'icône du premier bouton est définie, même si elle est nulle. De plus, la disposition du texte sur les boutons peut s'avérer incorrecte.

Pour recréer l'erreur:

  1. Cochez la case 1
  2. Désélectionnez case 1
  3. Cochez la case 3
  4. Maximiser la fenêtre

L'icône de case 1 devrait être nulle (vide) mais à la place il a l'icône de la croix.

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

Non reproductible sur macOS 10.12.6 avec SWT d'Eclipse Oxygen. –

+0

J'utilise Eclipse 3.4 sur Windows 7. – Michael

+0

Eclipse 3.4 est ancienne, il est fort probable que cela a été corrigé depuis. Essayez d'utiliser les pots SWT de [ici] (http://download.eclipse.org/eclipse/downloads/drops4/R-4.7-201706120950/) –

Répondre

1

Ce n'est pas idéal par tout moyen, mais si vous avez besoin d'une solution de contournement, une chose que vous pouvez essayer est Button emballage et en utilisant un StackLayout pour faire basculer entre un permis Button et un Button désactivé. De cette façon, vous n'êtes pas en train d'ajouter/supprimer le Image. Cela résout également les problèmes de mise en page, car les instances réelles Button ne changent pas d'état.

Par exemple:

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; 
    } 

} 

Encore une fois, ce n'est pas idéal, mais vous pouvez toujours ajouter des méthodes (addListener(...), etc.) à la classe MyButton d'appeler des méthodes sur le permis Button, qui est maintenant juste un détail d'implémentation.

Les modifications apportées à votre méthode 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()); 
     } 
    }); 

    // ... 

} 

Résultat: (Notez que je ne changeais le premier bouton)

enter image description here enter image description here