0

首先,让我尝试澄清一下我所说的“控制流”是指用户在我的 UI 中导航的方式。(这很可能不是我所描述的正确术语,所以如果你知道的话,请推荐一个更好的术语!)

大多数现代应用程序似乎让用户决定什么时候做什么。独立的控制单元主要涉及一些文本输入和最多鼠标点击。

对于我正在开发的应用程序,我想要一些不同的东西(请参阅这篇文章的结尾,以了解不可避免的“你为什么想要那个,那不是好的设计?”的答案)。下图显示了一个与我正在做的非常接近的示例 GUI,它只是被剥离并且业务域已被更改以使其易于理解:

示例 UI 图片

预期的控制流程如下:

1 user enters name of recipe, presses Enter
2 user enters ingredient, presses Enter
3 if ingredient field is empty, we're done: go to 9
4 dialog window shows up, queries database with user input and lets him select from a list of possible ingredients
5 if nothing was selected, go to 2
6 user enter amount, presses Enter
7 add this ingredient to an observable collection which is bound to the list
8 go to 2
9 dialog window shows up, prompts user for price of the mixture

我当前的代码基于KeyListener附加到所有那些拦截Enter按键的控件,调用所涉及的逻辑,然后手动setFocus()执行适当的下一个文本字段/其他控件。这行得通,但代码看起来很难维护,感觉很像几十年前我用 VB5 编写的代码。

有没有更好的方法来实现这一目标?我对通用设计模式和 WPF、JavaFX 或 Swing 等框架可能提供的特定解决方案都感兴趣。


为什么会有人想要那个?

两个原因:

  • 这个特殊的应用程序一直以这种方式工作,并且被许多计算机经验很少的人使用。给他们太多选择如何做以及何时做只会增加不必要的混乱。
  • 对于像这样的简单任务(或多或少只是数据输入),使用鼠标手动导航肯定比通过输入掩码的预定义路径更慢且更容易出错。
4

1 回答 1

1

问题

您正在重载 Enter 键。一种首选方法是让按钮代表动作。

如果您的金额字段与整个食谱而不是成分有关,那么您的金额字段位于错误的位置。将其移到成分列表之后。

纽扣

回到按钮。您可以在名称字段后、成分字段后和底部金额字段后有一个按钮。这允许用户明确他们想要更新的内容。

状态模式

您可以使用状态模式来跟踪用户已经做了什么,以及用户接下来可以做什么。如果用户不按顺序执行操作,您会在屏幕上的某处返回错误消息,指导用户下一步该做什么。

您必须枚举用户操作的所有不同可能性。使用 3 个按钮,可进行 6 种组合。

  • 名称、成分、数量(您所描述的)
  • 名称、数量、成分
  • 成分、名称、数量
  • 成分、数量、名称
  • 数量、名称、成分
  • 数量、成分、名称

您将决定哪些组合是有效的,哪些是无效的。状态树还有一个更复杂的地方,即您的用户可能要输入多种成分。

确定和取消按钮

除了管理状态,您还可以在 GUI 底部添加一对按钮,确定和取消。这允许您的用户以他们选择的任何顺序填写字段。在单击确定按钮之前,您不会检查有效性。

OK 按钮是通常与 Enter 键绑定的按钮。

您仍然需要在成分字段后有一个按钮,以允许用户输入多个成分。

于 2013-01-11T15:09:18.750 回答