2011-08-19 3 views
4

question Hypothétique:SWT décision de conception de contrôle utilisateur

Qu'en est cette décision de conception de SWT que pour faire un widget composé personnalisé Je dois sous-classe Composite? Est-ce vraiment sage?

Ne serait-il pas mieux si SWT avait une classe UserControl comme dans Win Forms ou quelque chose? Lorsque je sous-classe Composite mon widget personnalisé obtient l'interface Composite, même si elle n'est pas destinée à être utilisée comme Composite par les clients. C'est plutôt mauvais. La même chose est vraie pour certains widgets SWT, comme Spinner.

Existe-t-il un bon moyen de contourner ce problème?

Et, le plus intéressant: Quelqu'un connaît-il la motivation pour cette décision de conception?

+0

Pouvez-vous utiliser la délégation au lieu de l'héritage? –

+0

C'était aussi ma pensée, qu'il serait plus propre d'utiliser la délégation d'une manière ou d'une autre, peut-être d'étendre le contrôle et d'avoir un composite interne. Mais les directives de SWT indiquent que vous ne devez étendre que Composite ou Canvas. La toile ne semble pas être un bon ajustement, la plupart du temps. – Lii

+0

Depuis que je fais beaucoup de développement dans Swing, j'ai juste fini d'emballer tous les composants Swing que j'utilise depuis que les interfaces sont si volumineuses et mauvaises pour se moquer. –

Répondre

1

Vous pouvez créer votre propre classe NonCompositeUserControl:

public class NonCompositeUserControl extends Composite { 
    @Override 
    public void setLayout(Layout layout) { 
     throw new UnsupportedOperationException("This control is not really a composite") 
    } 
    // similarly for other methods 
} 
+0

Oui, vous pouvez ajouter un contrôle d'exécution comme celui-ci. Mais ce serait plus clair et moins sujet aux erreurs si vous n'aviez pas besoin de sous-classer Composite du tout. Par exemple, vous pouvez toujours passer cette classe en tant que parent lorsque vous créez un autre widget. – Lii

2

Vous pouvez regarder le code source pour org.eclipse.swt.custom.CCombo pour voir comment traite SWT avec ce problème en interne, comme CCombo s'étend de Composite. Voici comment ils traitent setLayout(), par exemple:

/** 
* Sets the layout which is associated with the receiver to be 
* the argument which may be null. 
* <p> 
* Note: No Layout can be set on this Control because it already 
* manages the size and position of its children. 
* </p> 
* 
* @param layout the receiver's new layout or null 
* 
* @exception SWTException <ul> 
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> 
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> 
* </ul> 
*/ 
public void setLayout (Layout layout) { 
    checkWidget(); 
    return; 
} 
+0

Oups, ils ne lancent même pas quand quelqu'un appelle cette méthode. Vous ne savez même pas que vous avez fait quelque chose de mal. – Lii

+0

Et mon point est que cela me semble un design discutable. Parce que vous héritez publiquement de l'interface Composite sur un widget qui n'est pas censé fonctionner en tant que Composite. Mais peut-être y a-t-il une bonne raison, il serait intéressant de savoir de quoi il s'agit. – Lii

Questions connexes