与 JComponent 相比,在 JPanel 上绘画有什么好处?

2023-11-27

所以在最近的一个回答中,有人评论了这一点(关于绘画):

“这可能是 90% Swing 程序员的某种毛病:当他们制作自己的组件时,他们总是扩展 JPanel 而不是 JComponent。为什么呢?”

我对编程还很陌生,所以我认为现在称自己为 Swing 程序员还为时过早,因为我还没有找到自己的定位。但压倒一切JPanel这就是我被教导的方式。于是我开始寻找这个问题的答案"Why?"评论者的问题。这些是我找到的一些答案。


背景绘画是主要区别。JComponent 类不绘制其背景,因此您必须在重写的paintComponent 方法中绘制背景。相比之下,JPanel 有一个不透明的背景,可以通过调用其paintComponennt 方法来绘制。


有些程序员更喜欢扩展 JPanel 类,而不是扩展 JComponent。 JPanel 旨在成为一个可以包含其他组件的容器,但也可以在其上进行绘制。只有一处不同。面板是不透明的,这意味着它负责绘制其边界内的所有像素。实现此目的的最简单方法是通过在每个面板子类的 PaintComponent 方法中调用 super.paintComponent 来使用背景颜色绘制面板:


如果 opaque 属性设置为 true ...那么 Swing 绘制系统就不必浪费时间尝试在组件后面绘制,从而提高性能。


我认为最后一句话确实最好地解释了这一点。但除了不透明之外,还有其他有利的原因吗?“90%的Swing程序员都有这个毛病”的延伸JPanel而不是JComponent?


不透明度处理的差异并不是唯一的因素。

查看 JPanel 源代码会有所帮助,因为它只有大约 100 行。

所有构造函数最终都会调用这个构造函数。 不透明度和双缓冲默认为 true。 默认的 LayoutManager 是 Fl​​owLayout,您可能需要也可能不需要。

public JPanel(LayoutManager layout, boolean isDoubleBuffered) {
        setLayout(layout);
        setDoubleBuffered(isDoubleBuffered);
        setUIProperty("opaque", Boolean.TRUE);
        updateUI();
}

Loy 等人在 O'Reilly 的 Java Swing 第 2 版中建议扩展 JComponent 以实现真正的自定义组件(第 1333 页),但也提到需要考虑 UI 委托。 JPanel 处理它自己的具体 AccessibleContext,而扩展 JComponent 的类则返回 null。

对于只读可视组件,我通常扩展 JComponent,但对于交互式组件,我可能会三思而后行,因为需要额外考虑可访问性。

Cheers,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 JComponent 相比,在 JPanel 上绘画有什么好处? 的相关文章

  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • 在 IntelliJ 上进行 Google App Engine Java 开发?

    令人烦恼的是 Google App Engine 已成为其中的另一个项目 他们只发布 Eclipse 插件 如 Spring Webflow 而我更喜欢 IntelliJ 你能用IntelliJ成功运行本地测试环境吗 并调试 部署本地或实时
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • firebase推送通知错误Spring Boot服务器端

    我正在尝试从 Spring Boot 服务器端发送通知到客户端 android 服务器运行良好 一切都很好 2020 09 01 08 13 07 691 INFO 18941 restartedMain e DevToolsPropert
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • 要打乱的键值(整数、字符串)列表的最佳结构

    我需要在 Java 中实现一个结构 它是一个键值列表 类型为整数 字符串 并且我想对其进行洗牌 基本上 我想做类似的事情 public LinkedHashMap
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • 从 sbt 程序集运行 uber jar 会导致错误:无法找到或加载主类

    我有一个使用 sbt 程序集插件打包为 uber jar 的 Spark 作业 这build sbt指定一个可运行的 main 作为生成的 uber jar 的目标 mainClass in assembly Some com foo Ba
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • Google Place Api:来自此 Android 客户端应用程序 com.package.name 的请求被阻止

    我在用PlaceAutocompleteFragment当我单击搜索字段 PlaceAutocompleteFragment 对话框消失时 我收到此错误 errors domain global re ason forbidden mess
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 如何在java 1.8中从org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8转换为oracle.jdbc.OracleConnection

    如何在 java 1 8 中从 org jboss jca adapters jdbc jdk8 WrappedConnectionJDK8 转换为 oracle jdbc OracleConnection 目前我正在这样使用并得到以下异常

随机推荐

  • Python 将 html 转换为文本并模仿格式

    我正在学习 BeautifulSoup 并发现了许多 html2text 解决方案 但我正在寻找的解决方案应该模仿格式 ul li One li li Two li ul 会成为 One Two and Some text blockquo
  • 使用流下载大文件时的 Axios 事件

    我正在使用 axios服务器端 我要下载big文件 从技术上讲 这应该与字节范围一起使用 axios 是否处理字节范围请求 以便仅在所有响应准备就绪时调用回调函数 If 1 is not true 我应该处理吗数据块我自己 在下面的代码中
  • 使用 imap 访问电子邮件

    我在 Ubuntu 14 02 上使用 Apache 并在其上运行 php 我已连接到远程 mssql 服务器 因此不需要 mysql 我想知道如何连接到 gmail 注册的电子邮件 ID 以便阅读传入的电子邮件 我已尝试以下操作 但从本地
  • 如何使用正则表达式模式找到后面没有换行符的回车符?

    我需要找到一个回车符 r 它后面没有换行符 n 我该如何使用正则表达式模式来做到这一点 那么以下带有负向前瞻的正则表达式怎么样 r n
  • 实体名称必须紧跟在 jasper 报告中的实体引用错误中的“&”之后

    我有一个包含 4 个子报告的主报告 当我在iReport 版本4 1 3 中生成报告时 报告生成成功 但是 当报告部署在 JBoss 服务器中时 会出现以下错误 Error Parsing Styled Text org xml sax S
  • 如何获得“不平衡”的 ggplots 网格?

    With grid arrange我可以安排多个ggplot通过使用类似以下内容的网格中的图形来实现多面板图形 library ggplot2 library grid library gridExtra 生成一些 ggplot2 图 然后
  • 什么是 uml 构造型以及如何使用它

    我正在为JAVA 软件设计绘制一个类UML 我实在不明白什么是刻板印象 正式定义 构造型是一个概要文件类 它定义如何将现有元类扩展为概要文件的一部分 它允许使用特定于平台或领域的术语或符号来代替或补充用于扩展元类的术语或符号 这是否意味着构
  • 将 0 移至数组末尾

    我需要将数组中的所有 0 移动到数组的末尾 示例 1 10 0 5 7 应该得到 1 10 5 7 0 我愿意做反向循环或常规循环 I cannot创建一个新数组 这是我到目前为止所拥有的 for int i arr length i lt
  • 从 csv 文件读取并根据第一列值提取某些数据列

    这是我的第一个批处理程序 我一直在网上搜索 但仍在努力编写解决方案 我有以下 CSV 文件 RH 2013 06 15 02 14 58 0400 X LQ3SUEEWPWKL6 005 FH 01 SH 2013 06 14 00 00
  • unix shell 中的数组?

    如何在 unix shell 脚本中创建数组 以下代码在 shell 中创建并打印字符串数组 bin bash array A B ElementC ElementE for element in array do echo element
  • 在 iPhone 上按下控制器时翻转动画

    我环顾四周 没有找到我真正想要的东西 有没有办法在推动视图控制器时获得翻转动画 我读到您可以通过使用模态视图控制器来更改动画 但据我所知模态视图的动画是从下到上的 这不是我想要的 有没有办法以某种方式获得翻转动画 像这样的东西应该有效 UI
  • 从控制台读取字符

    我编写控制台应用程序 它对 int 执行多次 scanf 之后 我执行 getchar int x y char c printf x n scanf d x printf y n scanf d y c getchar 结果我得到c n
  • 带 lapply 和 sapply 的日期

    我导入了一个包含大量日期的 CSV 文件 并使用 as Date 函数来转换日期 但是 当我使用 mapply 函数查找两个日期中较早的一个时 我最终要么得到一个包含日期的列表 要么得到一个数字向量 如何获得带有日期的向量 POP Star
  • 如何在没有原始 Markdown 输出的情况下使用 knitr 块将元素添加到绘图中?

    出于记录目的 我想要一些 html 输出中的情节代码 但不是情节 后来 我必须调用绘图代码 并向绘图添加一些内容 但只能看到附加代码 我试过这个 r non finished plotting eval FALSE plot 1 type
  • 我可以从 android webview 打开 Whatsapp 应用程序吗

    我制作了一个网站的网络视图 现在我想将我的网络视图中的一些数据共享到 Whatsapp 应用程序 我能够打开 Whatsapp 网页 但我的客户希望我打开 Whatsapp 应用程序而不是 Whatsapp 网页 我怎样才能做到这一点 这就
  • 最大自定义窗口失去投影效果

    我有一个自定义 WPF 窗口定义为
  • 错误 BC30456:“[方法]”不是“ASP.[CodeBehind]_aspx”的成员

    很简单的问题 我非常确定我已经正确链接了类 方法 代码隐藏等 网上很多帖子都说这与编译和 或 dll bin 文件有关 但他们的帮助都对我不起作用 Compiler Error Message BC30456 gvLegs PageInde
  • 如何在 Windows 上使用 Python 捕获 SIGINT?

    如同这个问题 在 Python 2 7 下的 UNIX 上 在 Python 提示符下 gt gt gt import signal gt gt gt def handler signal frame print welcome to th
  • 如何使用ID删除NDB实体?

    基于此文档https developers google com appengine docs python ndb entities deleting entities好吧 我仍然不确定为什么我不能在 NDB 上进行删除 def get
  • 与 JComponent 相比,在 JPanel 上绘画有什么好处?

    所以在最近的一个回答中 有人评论了这一点 关于绘画 这可能是 90 Swing 程序员的某种毛病 当他们制作自己的组件时 他们总是扩展 JPanel 而不是 JComponent 为什么呢 我对编程还很陌生 所以我认为现在称自己为 Swin