使用Swing创建Java GUI以进行表单输入

3

嗯,我在互联网上搜索了很多,但一直找不到答案,也许有人能提供一些见解。

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

所以我的问题是,试图使用所有文本字段和其他东西来创建GUI非常痛苦。因为每个小部件都有点不同,所以在填写表单后获取输入似乎需要单独引用每个小部件,以便可以逐个调用它们。这意味着每个部分的面板都有6-10个不同的私有字段。(我尝试将所有相似的小部件添加到列表中,并在循环中调用它们,但似乎不起作用。)

看起来Web表单在某些方面更适合这种情况,但我没有可用的基础设施来实现它。有没有人找到比这更好的解决方案?这似乎需要大量的代码。请参见下面的示例(我放了一些注释而不是实际代码,因为它太长了)。谢谢!

    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;
    }
}

感谢所有回答的人 - 我最终从普通的Swing中获得了非常好的结果,但是有很多很棒的建议,我将在未来的项目中尝试。非常感谢。 - Feanor
7个回答

5

Vanilla Swing过于冗长,这是毫无疑问的。对于这种情况,我通常会依赖一堆自己编写的工具/工厂方法,比如createTextBox(),它针对通用用途进行了参数化,并将执行必要的3-8个语句。

有时甚至会对布局进行参数化。我倾向于将所有布局都简化为GridBagLayout(其他人可能使用BorderLayout等,这只是个人喜好问题),然后创建方法将一个控件放置在网格的特定位置。

如果您不想使用Web界面,我建议仍然使用Swing。虽然冗长,但对于简单的表单来说并不是非常困难。


3

我可能有点疯狂,但我不喜欢图形界面构建器。我更喜欢手工编写代码所带来的额外控制。而且,由于你自己编写了代码,这使得调试变得更容易。重要的是按照逻辑顺序布局代码并使用方法论变量名。

你提到尝试使用列表。然而,我不认为这会节省你太多时间(或者像我之前暗示的那样,你在实现过程中节省的时间,将在调试过程中失去)。我猜测当你开始对JTextFields的输入进行合理性检查时,头疼就开始了。我建议将JTextField子类化为MoneyTextField、PhoneNumberTextField等,可以用来设置ActionListener以防止人们做蠢事。


1

1

Netbeans有一个相当不错的GUI构建器,大多数人都认为如此。这个屏幕录像展示了数据绑定功能,可能对你有所帮助。

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

是的,在整体上,GUI方面不是Java的强项,但你会发现它已经足够好了。


1

如果你有冒险精神,可以尝试使用Groovy和Griffon来完成。Griffon是一个GUI构建框架,通过自动化重复的部分,使GUI构建更加容易。请参阅http://griffon.codehaus.org/以获取更多详细信息。

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


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...)
   }
 }

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接