Swing 桌面开发

2024-03-07

我有一个关于 java 桌面 GUI 应用程序的非常普遍的问题。

我的经验:在过去的几年里,我开发了许多桌面应用程序,其中一些单独使用 Swing,一些使用 Spring-RCP(这很棒,但我仍然不能只押注于一个已经超过 3 年没有更新的框架) 。我也在看《Valkyrie RCP》,但在我看来,那里也确实没有那么多动静。我还使用 Wicket、Tapestry 以及最近的 JSF2 (Primefaces) 开发了 Web 应用程序。在获得了一些 Web 应用程序的经验后,我感觉 java 桌面 GUI 已经被放弃很久了。当然,我之前没有注意到这一点,但是在开发网络应用程序之后,我确实看到直接比较桌面用户界面编程是多么痛苦和复杂。

我在寻找什么:我在这里没有做任何火箭科学,我最怀念的是构建以下简单布局形式的简单方法

label_a    input_a    feedbackMessage_a
label_b    input_b    feedbackMessage_b
....
button_save

这不仅与布局有关,这可能是最小的问题。首先,我正在寻找一种将输入字段的值“绑定”到某种“支持 bean 字段”的方法。另外,我想使用直接反馈,这意味着如果 input_a 验证失败,我希望在 FeedbackMessage_a 处显示一条消息,而不是在其他地方显示消息。第三,我想使用 JSR-303 验证和直接反馈。 如果我深入研究典型桌面应用程序的源代码,我通常会看到每个按钮都有一个巨大的动作监听器,其中所有的值分配、验证和反馈消息创建都是手动编写的。将此与 Tapestry 或 jsf2 等 Web 框架进行比较。您要做的就是使用某种表达式语言将输入字段“绑定”到变量/字段,就是这样。该值正在被验证(例如使用 JSR-303 注释)并且(如果所有值都有效)自动传递到支持 bean 的绑定字段中。此外,如果发生验证错误,则会创建一条验证消息,其中输入字段的 id 用于标识负责的输入字段。如果该特定 ID 存在消息组件,则验证消息将在那里设置。一切顺利且合乎逻辑。

现在跳回桌面 GUI;要拥有一个可比较的用户界面,例如具有 20 个输入字段的表单,我可能需要 500 行侦听器代码,其中我首先自己读取每个文本字段的值,自己验证它,然后自己将其写入相应的变量中。如果我要使用 JSR-303,我可以自己调用验证器,但是回溯到相应的输入字段并在那里设置反馈消息会很痛苦......猜猜看......我自己!很痛苦,不是吗?

我的问题:有什么办法可以缓解疼痛吗?如何开发现代桌面应用程序?您使用什么框架以及为什么?是否有可能使用类似于 webframeworks 的绑定方式?我如何实现“直接反馈”,如上所述?我是否错过了这里的火车,或者在过去几年中编写 Web 应用程序真的变得更加简单,而 java-desktop 似乎陷入了困境? (JavaFx 除外,但这对我没有一点帮助)

最后的话不要误会我的意思,我是 Java 桌面应用程序的忠实粉丝。在像我工作的这样一家中等规模的公司中,具有同质环境(所有客户端都安装了相同的 java 版本等),我真的看不到 Web 应用程序的好处。使用 webstart,应用程序启动速度非常快(当然是在第一次启动下载之后)。 在我看来,虽然 Java 中以前端为中心的 Web 框架以光速向前发展,但 java-desktop 几乎没有任何进展。 虽然我可以接受现状,但我真的不得不问这个问题。


我从使用 JGoodies 验证框架的用户那里听到了很好的反馈,甚至结合了他们的FormLayout顾名思义,这是一个LayoutManager专门设计用于使组件看起来像表单。

我个人只有以下经验FormLayout以及一个内部开发的绑定框架,其中您所描述的 UI 的创建可以归结为每个标签编辑器组合的一行。 当然有一些可用的库可以为您提供这些,但我没有使用它们的经验,因此没有这方面的建议。

表单布局

  • website http://www.jgoodies.com/freeware/forms/
  • demo http://www.jgoodies.com/freeware/formsdemo/index.html(直接的webstart http://www.jgoodies.com/download/demos/forms/formsdemo.jnlp link)
  • Screenshot of a typical layout using the FormLayout FormLayout screenshot

验证框架

  • website http://www.jgoodies.com/freeware/validationdemo/index.html
  • 演示网络启动 http://www.jgoodies.com/download/demos/validation/validationdemo.jnlp
  • Screenshot of their validation framework in action Validation screenshot
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swing 桌面开发 的相关文章

  • JList 随机抛出 ArrayIndexOutOfBoundsExceptions

    我正在尝试异步将项目添加到 JList 但我经常从另一个线程收到异常 例如 Exception in thread AWT EventQueue 0 java lang ArrayIndexOutOfBoundsException 8 有谁
  • SwingWorker 在 Unsafe.park() 处挂起

    我有一个SwingWorker与后台服务器通信 然后更新JFrame 我正在调试我的应用程序并注意到即使在SwingWorker完成了它的工作 它的线程仍然存在 它挂在Unsafe park java lang Object 这是一个本机方
  • 摆动刷新周期

    我试图了解何时使用重新验证 重绘 打包 令人惊讶的是 我没有找到详细的底层文档 请随意链接 到目前为止我已经明白这都是 RepaintManager 的责任 油漆 重新油漆指的是脏 干净的东西 pack validate revalidat
  • 如果可能,将 jFrame 输出到第二台显示器

    我在 Java 中的 Swing 上有一个 jFrame 我希望它输出到第二个监视器 如果该监视器存在 我尝试过这个 通过this http download oracle com javase 6 docs api java awt Gr
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 当框架被拖动时,如何设置 JWindow 的位置位于文本字段下方?

    我正在制作一个自动完成项目 就像谷歌一样 我的框架中有一个 jtextfield 每当我在该字段中输入内容时 该文本字段下方就会出现一个 JWindow 并且该窗口来自另一个类 现在的问题是 每当我拖动框架时 如何使窗口始终出现在文本字段下
  • 如何使用 JUNG 对绘图边缘进行动画处理

    我是新来的JUNG 我有一个 FRLayout 它表示一个网络拓扑 其中关键节点或顶点的颜色为红色 其他顶点为蓝色 从起始节点到结束节点的边是蓝色的 我想演示到结束节点的路径的动画 如何以指定的时间间隔动画绘制从 start node 到
  • 在 Java 中重置 Graphics2D 对象

    我正在用 Java 尝试 Graphics2D 但像往常一样 我被困住了 P 问题是 假设我有这个代码 Graphics2D g Graphics2D this getGraphics Inside a JFrame g rotate Ma
  • 如何在netbeans(Java Swing)中查看同一JFrame中包含许多子jPanel的另一个jPanel

    我想通过按钮事件操作显示另一个 jPanel 例如 private void jButtonMouseClicked MouseEvent e getContentPane removeAll update getGraphics code
  • Swing:有没有一种方法可以区分用户引起的 ItemEvent 和应用程序引起的 ItemEvent?

    我正在基于 Swing 的应用程序中使用组合框 并且很难弄清楚如何区分由用户事件生成的 ItemEvent 和由应用程序引起的 ItemEvent 例如 假设我有一个组合框 combo 并且我正在使用 ItemListener 监听 ite
  • 如何在 Java 中使 JFrame 可滚动?

    我有这段代码 我试图在其中安装可滚动面板 JPanel 但我不明白 这是我的代码 public class Sniffer GUI extends JFrame Canvas c new Canvas ConnectorProperties
  • GridLayout 删除 JPanel 之间的填充

    我正在从事一个计算机科学项目 但我无法找到任何解决我的问题的方法 我正在创建一个二维数组JPanels 包含通过 a 的图像GridLayout 我想删除所有面板之间的填充 边距 以便它无缝地流入单个图像 但是 setHGap 和 setV
  • 如何将 JRadioButton 组与模型一起使用

    有没有什么方法可以将一组 JRadioButtons 与数据模型关联起来 以便更容易判断选择了哪个按钮 如果有 在理想的世界中 我想将一组 N 个单选按钮与一个enum类有一个NONEvalue 和与每个单选按钮关联的一个值 我解决了我自己
  • 使用可变参数绘制星形

    我的任务是编写程序 允许用户绘制星星 星星的大小和手臂数量可能不同 当我处理基本星时 我使用 GeneralPath 和点表进行处理 int xPoints 55 67 109 73 83 55 27 37 1 43 int yPoints
  • 如何在java中模拟SHIFT+鼠标按键

    我想将鼠标指针移动到特定位置并执行 SHIFT 鼠标右键单击 我可以将鼠标移动到某个位置 但无法模拟鼠标单击 Robot r new Robot r mouseMove x1 y1 我应该做什么来模拟预期的鼠标点击 我认为您只需要一点额外的
  • 缩放 JCheckBox 框

    我想扩展一个JCheckBox例如等于其设置文本的字体大小 例如当我增加Font大小复选框本身很小 但它应该随着文本而增长 或者我想自己设置框的大小 JCheckBox chckbxTest new JCheckBox Test chckb
  • 如何读取文件,将数据放入JTable中,然后修改单元格/删除行并将数据保存到文件中? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要从 txt 文件中读取日期并将其放入 GUI 中的 JTable 中 然后修改一些记录或删除一些行并将新数据保存到文件中 我可以
  • JFrame 中的 JavaFX 菜单

    我想在 JFrame 中使用 JavaFX 菜单 我使用 JFXPanel 嵌入它 并且它在 JFrame 中可见 但是 问题是 菜单项不响应鼠标 我可以单击菜单 但不能单击菜单项 如果我使用键盘选择 MenuItem 并按 Enter 键
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder

随机推荐

  • Angular:7.2.1 ES6 类 ReferenceError:初始化前无法访问“X”

    我有以下 TypeScript 课程 export class Vehicule extends TrackableEntity vehiculeId number constructor super return super proxif
  • 通过 C# 中的反射引发事件

    我想要编写一个可重用的函数通过反射引发事件 经过搜索 我发现了这个类似的问题 如何在 NET C 中通过反射引发事件 https stackoverflow com questions 198543 how do i raise an ev
  • GCC 在 Alpine Linux 中找不到 stdio.h

    在新的 Alpine Linux 中 我安装了 GCC apk add update cache gcc 但仍然是一个简单的程序 include
  • 内联标记块 (@

    Content

    ) 不能嵌套。仅允许一级内联标记

    您好 我收到错误 Inline markup blocks p Content p cannot be nested Only one level of inline markup is allowed 将 Kendo UI 选项卡条和 M
  • 如何实现空对象?

    Details 我找到了一些关于空对象模式 here https softwareengineering stackexchange com questions 152094 null pointers vs null object pat
  • SQL SSIS 转换问题

    我有一个 excel 文件 我正在将其转换为 SSIS 包中的 prn 我的问题 我的其中一栏有货币 所有内容都应该有小数点 但并非所有数字都有 例如 如果没有美分 它只会读取 10425 我需要在 SSIS 中执行的操作是读取 10425
  • Laravel Eloquent 将变量传递给关系函数

    我正在使用 eloquent 来查询数据库条目及其对应关系 问题是我需要通过 date关系中的变量query如下图所示 我可以通过 date变量到第一个查询 因为它不在 with 函数内 我怎样才能用第二个来实现这个目标 Query pub
  • 是否可以存储 Team Foundation Server 自动登录的凭据?

    是否可以存储证书我用来连接到我的团队基础服务器直接在视觉工作室2010 我想避免在每次 VS 启动时插入它们 问题是托管 TFS 的计算机不在域中 并且我使用在该计算机上创建的用户的凭据进行连接 假设机器名是TOOLS 用户是Marco 我
  • GPU 的延迟是多少?

    我可以找到 CPU 核心与其缓存 主内存等之间的 CPU 周期延迟 但似乎很难找到有关现代 GPU 的类似信息 有谁知道 GPU 的延迟 特别是现代 nvidia GPU GF110 或更高版本 与其内存之间的延迟 谢谢 GPU 内存确实具
  • 如何检查 Anaconda 上的 cuda 是否安装正确

    我已经在 Anaconda 上使用以下命令安装了 Cuda conda 安装 c anaconda cudatoolkit 之前我也使用过以下命令来安装 Tensorflow GPU 版本 conda 安装 c anaconda tenso
  • INSERT INTO sqlsrv_query 语句不起作用

    使用 sqlsrv query 命令时 我可以从 MSSQL 服务器请求数据 这有效 但 当我想添加数据时 它返回错误 error array 我为此使用的代码是 tsql INSERT INTO dbo VERLOF events id
  • ObjectStateManager 不包含具有对象引用的 ObjectStateEntry

    我以为我了解 EF 特别是在极其简单的 CRUD 方面 但我可能是错的 我有一个 ObjectContext Repository 模式 在本例中是一个包含 VatRates 集合的 VatCode 实体 增值税代码 1 增值税税率 我想提
  • 多个元素的布尔运算符

    我知道有人可以做 any gt 3 1 2 3 4 5 但优雅的实现方式是什么 any and gt 3 lt 5 1 2 3 4 5 or all or lt 2 gt 4 1 2 3 4 5 etc 我相信您想检查是否有任何元素同时存在
  • Android Tabhost更改文本颜色样式

    尝试更改 tabhost 文本颜色 在这段代码中我可以更改 tabhost 背景颜色 不是文本颜色 tabHost setOnTabChangedListener new OnTabChangeListener Override publi
  • C++ - 在 Visual Studio 2010 的属性表中使用环境变量

    我想建立一个使用 OpenCV 的项目 所以基本上 我必须使用 Visual Studio 2010 中的属性管理器添加一个新的属性表 基本上 我必须将路径添加到我的include and lib文件夹以使 OpenCV 正常运行 我想将我
  • 如何删除 HTML 节点之间的空白?

    我正在尝试从 HTML 片段中删除空格 p tags p p Foo Bar p p bar bar bar p p bla p 正如你所看到的 之间总是有一个空格 p p tags 问题是空白会产生 br 将字符串保存到我的数据库时的标签
  • Spark SQL“限制”

    环境 使用 Hadoop 的 Spark 1 6 Hortonworks 数据平台 2 5 我有一个包含 100 亿条记录的表 我想获取 3 亿条记录并将它们移到临时表中 sqlContext sql select from my tabl
  • 如何聚焦位于子组件中的输入字段

    我在父组件中有一个按钮 我想通过单击该按钮来聚焦位于子组件中的输入字段 我该怎么做 您可以利用refs达到结果 class Parent extends React Component handleClick gt this refs ch
  • Laravel 身份验证,我无法检索登录的用户

    Auth check 总是返回 false 这很奇怪 因为登录函数将我重定向到 redirectTo url 因此尝试成功 但之后我无法检索用户 我正在使用 Laravel 5 2 14 和 Xampp 我不知道还要写什么 因为它应该是开箱
  • Swing 桌面开发

    我有一个关于 java 桌面 GUI 应用程序的非常普遍的问题 我的经验 在过去的几年里 我开发了许多桌面应用程序 其中一些单独使用 Swing 一些使用 Spring RCP 这很棒 但我仍然不能只押注于一个已经超过 3 年没有更新的框架