在Swing中创建Java GUI以进行表单输入

时间:2009-05-05 08:32:12

标签: java user-interface swing

好吧,我已经浏览了整个互联网并且无法找到这个问题的答案,所以也许有人可以提供一些见解。

我正在开发一个相对简单的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;
    }
}

7 个答案:

答案 0 :(得分:5)

Vanilla Swing很冗长 - 没有争论。基本上对于这种事情,我最终依赖于一些本地生成的util / factory方法,比如createTextBox(),这些方法被参数化以供常用,并将执行必要的3-8语句。

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

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

答案 1 :(得分:3)

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

您提到尝试使用列表。但是,我没有看到这将如何为您节省很多时间(或者我暗示,在您实施时节省的时间,您将在调试过程中丢失)。我猜你在开始理智检查JTextField的输入时会出现令人头疼的问题。我建议将JTextField子类化为MoneyTextField,PhoneNumberTextField等,这可用于设置ActionListener以阻止人们做蠢事。

答案 2 :(得分:1)

Netbeans有一个gui构建器,大多数帐户都相当不错。此屏幕演示显示了可能对您有帮助的数据绑定功能。

另一个选择可能是推出自己的演示框架,根据你想要的复杂程度,这个框架并不那么难,而且很有趣。只需使用反射从对象中提取字段,然后将这些字段转换为小部件,然后再将其转换回来。确保使用布局管理器为您完成大部分繁重工作。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您可以查看我尝试解决此问题的方法:http://code.google.com/p/swing-formbuilder/

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我会从XML文件创建一个这样的表单,比如

<form name="MyForm" package="com.nowhere.swing">
 <field component="javax.swing.JTextField" label="Enter your Name" pattern="[a-z]+" name="name"/>
 <field component="javax.swing.JTextArea" label="Enter your Comment" pattern="[a-z]+" name="comment"/>
</form>

然后,使用XSLT然后我会为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...)
   }
 }