当前位置: 首页 > 知识库问答 >
问题:

你不需要画布或JPanel来画画吗?

乐刚毅
2023-03-14

我的印象是,在JFrame上放置图形需要画布或JPanel,但我之前看到一个视频,其中一个人在扩展JFrame时使用绘画(graphics g),而没有制作面板或画布。如果是这样的话,为什么人们要费心制作画布或JPanel呢?

共有1个答案

江育
2023-03-14

JFrame扩展自Frame,它扩展自窗口,它扩展自容器,扩展自定义绘制组件

如果是这样的话,为什么人们要费心制作画布或JPanel呢?

要回答这个问题,您需要更好地理解JFrame(以及基于窗口的类)。

JFrame实际上是一个复合组件,也就是说,它由许多其他组件组成,这些组件提供了窗口的核心功能

这意味着,如果覆盖绘制并在框架上执行自定义绘制,很可能会在子组件上绘制,或者子组件将在其上绘制,并且由于绘制子系统的工作方式,在没有调用框架的绘制方法的情况下,随时都会这样做。

框架包括其可用区域内的窗户装饰。这意味着“可视”区域实际上比框架的定义区域小。

这也是为什么建议使用pack而不是setSize

这意味着,如果你覆盖paint,你实际上可以在窗户装饰下画画(是的,这种情况经常发生,我们已经厌倦了回答这个问题)

屏幕截图从我如何设置在中间?

JFramecontent entPane处理了这个问题,因为它是在可视区域内布局的。

顶级容器,比如JFrame不是双缓冲的,因此,即使您克服了上述所有问题,也会得到闪烁的更新。当然,你可以“设计”自己的双缓冲算法,但在Swing(即JPanel)中,它是免费的,所以何必费心呢

作为一般建议,我们通常不鼓励从JFrame(或其他顶级容器)扩展,因为它将您锁定在单个用例中,并防止重复使用的可能性。

另一方面,如果您使用JPanel,您可以将它添加到您想要的任何容器中

 类似资料:
  • 在IE9画布中现在是否支持虚线/点线?目前我正在做与以下内容非常相似的事情: 这在IE7、IE8、IE9兼容模式和FireFox中工作很好,然而,在IE9和Chrome中,为每条虚线绘制一个实心笔画。 对为什么会发生这种情况有什么想法吗?

  • 我找到了几个与此相关的问题和答案,但没有一个解决方案让我明白为什么这段代码不起作用: 我有一个tkinter窗口,其中动态生成了内容——这意味着如果屏幕上有两个或多个小部件要显示,则需要能够向下滚动。我希望能够用小部件填充框架“f”,然后使用画布。创建_window()函数以可滚动方式显示它。 现在显示窗口,但滚动条未启用-类似于滚动区域不正确或滚动条与画布之间的链接不正确。

  • Sketch 里的画布尺寸是无限的。你可以用无限精准的分辨率无关模式来查看画布,或者打开像素模式来查看每一个像素导出后的样子。 如果你想在画布中设置一个固定的边框,你可以直接用画板 (Artboard) 工具创造一个新的画板。 导航 画布中的导航是非常容易的,你可以直接用鼠标滚轮滑动或者电脑的触摸板来控制方向。你还可以按住空格键,来使用抓手工具移动画布。并且,没有任何对象被选中的时候,你可以用方向

  • createCanvasContext CanvasContext ft.createCanvasContext(string canvasId, Object this) 创建 canvas 的绘图上下文 CanvasContext 对象 参数 string canvasId 要获取上下文的 canvas 组件 canvas-id 属性 Object this 在自定义组件下,当前组件实例的th

  • CanvasContext jd.createCanvasContext(string canvasId, Object this) 创建 canvas 的绘图上下文 CanvasContext 对象 参数 string canvasId 要获取上下文的 canvas 组件 canvas-id 属性 Object this 在自定义组件下,当前组件实例的this,表示在这个自定义组件下查找拥有 c

  • 属性 类型 默认值 必填 说明 type string 否 指定 canvas 类型,支持 2d,基础库版本1.10.11开始支持2d和webgl canvas-id string 否 canvas 组件的唯一标识符 disableScroll Boolean false 否 当在 canvas 中移动时且有绑定手势事件时,禁止屏幕滚动以及下拉刷新 bindtouchstart 手指触摸动作开始