2009-05-05 99 views
3

那么,我已经查看了整个互联网,并且一直未能找到这个问题的答案,所以也许有人可以提供一些见解。在Swing中为表单输入创建一个Java GUI

我正在开发一个相对简单的Java应用程序,它将替换当前用于系统访问请求的Word文档。它旨在允许输入新的员工聘用信息 - 名称,需要的访问等等。

所以这是我的问题。试图制作一个带有所有文本字段的GUI,所有内容都令人吃惊。因为每个小部件都有点不同,所以填写表单时获取输入似乎需要为每个小部件分别引用,以便我可以单独调用它们。这意味着一个部分的每个面板都有6-10个不同的专用字段。 (我试图将所有类似的小部件添加到列表中,并在循环中调用它们,但这似乎不起作用。)

似乎网络窗体在某些方面会更适合此,但我不会没有可用的基础设施来做到这一点。有没有人发现比这更类似的东西更好的解决方案?它只是看起来像一吨代码。请参阅下面的一个想法(我提出了一些意见,而不是实际的代码,因为它太长了)。感谢您的期待!

private JComboBox my_dates; 
    private JTextField my_date1; 
    private JTextField my_date2; 
    private JTextField my_request_date; 
    private JTextField my_new_legal_name; 
    private JTextField my_new_pref_name; 
    private JTextField my_new_username; 
    private JTextField my_prev_legal_name; 
    private JTextField my_prev_pref_name; 
    private JTextField my_prev_username; 
    private JTextField my_emp_id; 
    private JTextField my_manager; 
    private JTextField my_auth_requestor; 
    private JTextField my_auth_phone; 

    public NameChangePanel(FormSection the_section) 
    { 
     super(); 
     initialize(); 
     buildPanel(the_section.getFields()); 
    } 

    private void initialize() 
    { 
     // Create all the widgets individuall 
    } 

    private void buildPanel(List the_fields) 
    { 
     // add a field label 
     // add a component 
     // repeat for all values 
    } 

    public List getFormValues() 
    { 
     // Call all of the private fields individually 
     return values; 
    } 
} 
+0

谢谢大家谁回答 - 我最终得到的纯“醇摇摆效果还不错,但也有很多很好的建议,我会尝试为未来的项目。非常感激。 – Feanor 2009-05-10 08:26:21

回答

5

Vanilla Swing是冗长的 - 没有参数。基本上,对于这种事情,我最终依赖一些自制的util/factory方法,如createTextBox(),它被参数化为通用用法,并将执行必要的3-8条语句。

我有时甚至会参数化布局。我倾向于将所有的布局减少到GridBagLayout(其他人做BorderLayout等;这只是个人喜好的问题),然后创建方法将控制在网格中的特定点。

如果你不打算以网络为基础,我会坚持使用Swing。它可能是冗长的,但对于简单的表单来说并不是那么困难。

1

Netbeans有一个gui的建设者,大多数帐户相当不错。此屏幕演示展示了可能对您有用的数据绑定功能。

另一种选择可能是推出自己的展示框架,这取决于你想要的复杂程度,并不那么困难和有趣。只需使用反射来将字段拉出对象并将这些字段翻译成小部件并再次返回。请务必使用布局管理器为您完成大部分繁重工作。

是的,总的来说,gui的东西并不是java的强项,但你应该觉得它够好的。

1

如果您喜欢冒险,可以尝试在groovy中使用griffon。 Griffon是一个GUI构建框架,通过自动执行重复部分,可以使gui轻松建立。有关更多详细信息,请参阅http://griffon.codehaus.org/

如果你知道如何使用grails,griffon会感觉相似,因为它使用类似的概念和隐喻来构建。

0

看看BetterBeansBinding。这是一个工具,可以很容易地在对象之间绑定各种JavaBean类似的属性。您将设置一个保存请求的对象,并将该对象的属性绑定到各种gui组件。当你完成后,只需返回绑定的对象,它应该填写所有的字段。

请注意,我以前没有真正使用过这个,但我已经看到了这个概念,并且在发布之前做了类似的事情。

0

我将创建一个这样的形式从一个XML文件,像

​​

,然后使用​​那么我会生成一个POJO和使用这个定义了Swing 接口的Java代码。

class MyFormPojo 
{ 
private String name; 
private String comment; 
(...) 
} 

class MyFormPane extends JPanel 
{ 
JTextField field4name; 
    JTextArea field4comment; 
(...) 
MyFormPane() 
    { 
    (...) 
    field4name= new JTextField(); 
    (.. create labels, etc...) 
    } 
} 
3

叫我疯了,但我不喜欢gui建设者。我更喜欢手写代码带来的额外控制。另外,当你自己编写代码时,它使调试变得更容易。重要的是按照逻辑顺序布置代码并使用有方法的变量名称。

您提到尝试使用列表。但是,我不明白这会如何为您节省很多时间(或者我曾暗示过,您在实施过程中节省的时间,在调试过程中会丢失)。我猜测,当你开始理智检查你的JTextFields的输入时,头痛就开始了。我建议将JTextField继承为MoneyTextField,PhoneNumberTextField等,这可以用来设置ActionListener来阻止人们做愚蠢的事情。