Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以用Java构建通用表单吗_Java_Forms_Performance_Generics - Fatal编程技术网

可以用Java构建通用表单吗

可以用Java构建通用表单吗,java,forms,performance,generics,Java,Forms,Performance,Generics,是否可以用Java构建通用表单,以便在每个域类的不同字段上插入不同类型的数据?如果可能,该应用程序的运行速度会比为每个域类创建单独的表单快吗? 谢谢简短回答:这是可能的。 但是,这是一个需要仔细考虑的设计决策,在决定是动态还是手动构建表单时,需要考虑许多因素 您需要创建多少个表单,并且以后需要的表单数量会增加吗? 如果这是真的,那么您可以考虑开发一个DSL(特定于域的语言),它允许您轻松地设计表单,并拥有一个知道如何读取DSL并相应地创建表单的类。 如果窗体的数量是有限的< /强>,并且只需要

是否可以用Java构建通用表单,以便在每个域类的不同字段上插入不同类型的数据?如果可能,该应用程序的运行速度会比为每个域类创建单独的表单快吗?
谢谢

简短回答:这是可能的。 但是,这是一个需要仔细考虑的设计决策,在决定是动态还是手动构建表单时,需要考虑许多因素

您需要创建多少个表单,并且以后需要的表单数量会增加吗? 如果这是真的,那么您可以考虑开发一个DSL(特定于域的语言),它允许您轻松地设计表单,并拥有一个知道如何读取DSL并相应地创建表单的类。

<强>如果窗体的数量是有限的< /强>,并且只需要创建一次(稍后将不添加任何表单),那么您可以考虑手动开发它们。(如果它比编写动态创建表单的代码快,那么当然,编写基于某些参数动态创建表单的代码需要更多的思考)

我将为您提供一个非常简单的示例,说明我上面的意思。下面是我开发的一个方法示例,该方法基于您选择的年份和月份动态创建日历,并显示可单击的按钮,让您选择一个
复选框,该复选框指定您选择的日期是否为“已付款”离开或不离开。注意:这只是构建日历的方法,而不是具有其他功能的整个表单。但是这部分是动态构建的,所以我只附上这一部分

private void constructCalendar()
{
    int index = 1;
    int day = 1;
    int columns = ((GridLayout) daysPanel.getLayout()).getColumns();
    int rows = ((GridLayout) daysPanel.getLayout()).getRows();
    int selectedYear = Integer.parseInt(year.getValue().toString());
    int month = monthsList.getSelectedIndex();
    GregorianCalendar gc = new GregorianCalendar(selectedYear, month, 1);

    String[] days = select.getWeekDays();

    for (int i = 1; i <= columns; i++)
    {
        JLabel lab = new JLabel(days[i - 1]);
        lab.setHorizontalAlignment(SwingConstants.CENTER);
        lab.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        lab.setFont(new Font("Cambria", Font.BOLD, 14));
        if (i == 6 || i == 7)
        {
            lab.setForeground(Color.red);
        }
        daysPanel.add(lab);
    }
    for (int i = columns; i >= 2; i--)
    {
        for (int j = 1; j <= rows; j++)
        {
            if (index >= (gc.get(GregorianCalendar.DAY_OF_WEEK) + 5) % 7 + 1 && day <= gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH))
            {
                daysPanel.add(new LeaveItem("" + day, "Paid", addList, removeList, year.getValue().toString(), "" + (month + 1), leaveDays));
                day++;
            } else
            {
                daysPanel.add(new JLabel());
            }
            index++;
        }
    }

}

简短回答:这是可能的。 但是,这是一个需要仔细考虑的设计决策,在决定是动态还是手动构建表单时,需要考虑许多因素

您需要创建多少个表单,并且以后需要的表单数量会增加吗? 如果这是真的,那么您可以考虑开发一个DSL(特定于域的语言),它允许您轻松地设计表单,并拥有一个知道如何读取DSL并相应地创建表单的类。

<强>如果窗体的数量是有限的< /强>,并且只需要创建一次(稍后将不添加任何表单),那么您可以考虑手动开发它们。(如果它比编写动态创建表单的代码快,那么当然,编写基于某些参数动态创建表单的代码需要更多的思考)

我将为您提供一个非常简单的示例,说明我上面的意思。下面是我开发的一个方法示例,该方法基于您选择的年份和月份动态创建日历,并显示可单击的按钮,让您选择一个
复选框,该复选框指定您选择的日期是否为“已付款”离开或不离开。注意:这只是构建日历的方法,而不是具有其他功能的整个表单。但是这部分是动态构建的,所以我只附上这一部分

private void constructCalendar()
{
    int index = 1;
    int day = 1;
    int columns = ((GridLayout) daysPanel.getLayout()).getColumns();
    int rows = ((GridLayout) daysPanel.getLayout()).getRows();
    int selectedYear = Integer.parseInt(year.getValue().toString());
    int month = monthsList.getSelectedIndex();
    GregorianCalendar gc = new GregorianCalendar(selectedYear, month, 1);

    String[] days = select.getWeekDays();

    for (int i = 1; i <= columns; i++)
    {
        JLabel lab = new JLabel(days[i - 1]);
        lab.setHorizontalAlignment(SwingConstants.CENTER);
        lab.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        lab.setFont(new Font("Cambria", Font.BOLD, 14));
        if (i == 6 || i == 7)
        {
            lab.setForeground(Color.red);
        }
        daysPanel.add(lab);
    }
    for (int i = columns; i >= 2; i--)
    {
        for (int j = 1; j <= rows; j++)
        {
            if (index >= (gc.get(GregorianCalendar.DAY_OF_WEEK) + 5) % 7 + 1 && day <= gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH))
            {
                daysPanel.add(new LeaveItem("" + day, "Paid", addList, removeList, year.getValue().toString(), "" + (month + 1), leaveDays));
                day++;
            } else
            {
                daysPanel.add(new JLabel());
            }
            index++;
        }
    }

}

你是说仅仅创建泛型类吗?因为这在Java中是可能的。我不确定,但我需要的是创建一个JFrame,然后在域类需要时动态更改或隐藏字段。哦,我想我知道你在说什么。你可以使用instanceof来检查它是什么类型的对象,然后构建y我们的jFrame是相应的,但可能有一种更好的方式我只是不知道。更快?也许,也许不是。但它保证是丑陋的,几乎不可用。用户界面功能正确是不够的,它需要以可读的方式组织。一行一行地显示一串字段,作为一个连续的文本墙,是很好的uch与可用性相反。手动一个接一个地创建用户界面,记住可读的布局。(有许多书籍和网页致力于良好的用户界面设计。)你的软件会好得多。我认为通过代码创建它并不一定难看,特别是如果你花时间并记住管理不同屏幕大小的距离。我所希望的是不要每次开发应用程序时都浪费时间创建ui,然后不为你说的仅仅是制作通用而付费类?因为这在Java中是可能的,我不确定,但我需要的是创建一个JFrame,然后在域类需要时动态更改或隐藏字段。哦,我想我知道你在说什么。你可以使用instanceof来检查它是什么类型的对象,然后相应地构建你的JFrame,但可能有一个更好的方式我不知道。更快?也许,也许不是。但它肯定是丑陋的,几乎不可用。用户界面功能正确是不够的,它需要以可读的方式组织。显示一堆字段,一行一行,作为连续的文本墙,几乎与可用性相反。创建你的用户界面是手动的,一个接一个,并考虑到可读的布局。(有很多书和网页致力于良好的用户界面设计。)你的软件会好得多。我认为通过代码创建它并不一定难看,特别是如果你花时间并记住管理不同屏幕大小的距离。我所希望的是不要每次开发应用程序时都浪费时间创建ui,然后不付钱。我已经看到了你在那里做的事情,非常优雅的解决方案满足您的需求。我使用动态表单创建的目的是将应用程序连接到数据库,创建域类,然后调用表单工厂为我构建表单,因为让我们面对现实吧,这需要大部分时间。我已经看到了您在那里做的事情,非常优雅的解决方案满足您的需求。我将使用dyn