Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT用户控制设计决策_Java_Swt_Composite - Fatal编程技术网

Java SWT用户控制设计决策

Java SWT用户控制设计决策,java,swt,composite,Java,Swt,Composite,假设问题: 这个SWT设计决策如何?为了制作一个定制的复合小部件,我必须对复合小部件进行子类化?这真的明智吗 如果SWT有一个像Win Forms之类的UserControl类不是更好吗 当我将Composite子类化时,我的自定义小部件将获得Composite接口,即使它不打算被客户端用作Composite。那有点糟糕。对于一些SWT小部件(如Spinner)也是如此 有什么好办法吗 而且,最有趣的是:有人知道这个设计决策的动机吗?您可以创建自己的nonpositionUserControl类

假设问题:

这个SWT设计决策如何?为了制作一个定制的复合小部件,我必须对复合小部件进行子类化?这真的明智吗

如果SWT有一个像Win Forms之类的UserControl类不是更好吗

当我将Composite子类化时,我的自定义小部件将获得Composite接口,即使它不打算被客户端用作Composite。那有点糟糕。对于一些SWT小部件(如Spinner)也是如此

有什么好办法吗


而且,最有趣的是:有人知道这个设计决策的动机吗?

您可以创建自己的
nonpositionUserControl
类:

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
}

您可以查看
org.eclipse.swt.custom.CCombo
的源代码,了解swt如何在内部处理这个问题,因为
CCombo
是从
Composite
扩展而来的。下面是它们如何处理
setLayout()
,例如:

/**
 * 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;
}
/**
*设置与要接收的接收器关联的布局
*可能为空的参数。
*
*注意:无法在此控件上设置布局,因为它已存在
*管理其子级的大小和位置。
*

* *@param layout接收器的新布局或null * *@exception-SWTException
    *
  • 错误\u小部件\u已处理-如果接收器已处理
  • *
  • 错误\u线程\u无效\u访问-如果未从创建接收器的线程调用
  • *
*/ 公共空间布局(布局){ checkWidget(); 返回; }
是的,您可以像这样添加运行时检查。但如果您根本不需要将Composite子类化,那么它将更清晰,更不容易出错。例如,当您创建另一个小部件时,您仍然可以将该类作为父类传递。您可以使用委派而不是继承吗?这也是我的想法,以某种方式使用委派会更干净,可能会扩展控件并具有内部组合。但是SWT指南说您应该只扩展Composite或Canvas。Canvas在大多数情况下似乎也不太合适。因为我在Swing中进行了大量开发,所以我最终包装了我使用的所有Swing组件,因为接口太大,不利于模拟。在SWT中,FAQ是关于子类化的很好解释,这篇文章也可以回答您的一些问题或疑问。我已经看到了这些,它们很好。阻止扩展标准小部件似乎是个好主意,但让自定义控件扩展复合控件或画布似乎有点奇怪。但这也不是什么大问题。哎呀,当有人调用这个方法时,他们甚至都不会抛出。你甚至不知道你做错了什么。我的观点是,这对我来说似乎是个可疑的设计。因为您公开继承了一个小部件上的复合接口,而这个小部件不应该作为复合接口使用。但也许有一个很好的理由,知道它是什么会很有趣。