Swing GUI工厂方法模式

时间:2012-05-30 14:36:22

标签: java swing design-patterns methods factory

我希望使用工厂方法模式,以使我的Swing UI开发更快,更易于管理。

通常,它是一个使用JInternalFrames的MDI应用程序。我在系统中有很多设置,我称之为类型(例如,userTypes,accountTypes等)。我有一个固定的UI,我决定使用它。事实上,系统中有超过50种这样的类型,因此工厂方法模式似乎是最易于管理的解决方案。以下是工作应用的两个屏幕截图。

main part of a record enter image description here

我正在看[这个例子] [3]但是由于我无法估计我需要将所有信息存储在记录中的标签数量,我需要能够添加多个标签和控件(这些标签中的标签,文本框,表格,组合框等。

基于该示例,是否可以在抽象类中创建JTabbedPane并在子类中修改并添加它?我尝试了以下内容并且有点迷失:

public AbstractTypeInternalFrame(String title) {
        setBounds(100, 100, 808, 589);

        JToolBar toolBar = new JToolBar();
        getContentPane().add(toolBar, BorderLayout.NORTH);

        JButton btnAdd = new JButton("Add");
        toolBar.add(btnAdd);

        JButton btnSave = new JButton("Save");
        btnSave.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });
        toolBar.add(btnSave);

        JButton btnDelete = new JButton("Delete");
        toolBar.add(btnDelete);

        JButton btnCancel = new JButton("Cancel");
        btnCancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        toolBar.add(btnCancel);

        JTabbedPane recordTabs = new JTabbedPane(makeRecordTabPane());
        getContentPane().add(recordTabs, BorderLayout.NORTH);

        JSeparator recordSearchSeparator = new JSeparator();
        getContentPane().add(recordSearchSeparator, BorderLayout.NORTH);



    }

    protected abstract int makeRecordTabPane();

使用makeRecordTabPane()方法需要返回一个int。

正如你所看到的,我有点失落,只是需要一些指导如何进行这样的模式。如果有任何建议甚至是示例/链接,我们将不胜感激。

我意识到我的问题很模糊,所以如果我需要澄清,请随时提出。

最好的问候。

1 个答案:

答案 0 :(得分:0)

以下是更详细的问题。

因此,我希望为系统上的记录构建一个简单的JInternalFrame用于CRUD操作。记录如用户,用户类型,帐户,帐户类型等。系统中有超过50种这样的类型,因此我使用工厂方法模式可以使所有这些JInternalFrame更易于管理。

以下是用户记录的示例:

Link1 Link2

上半部分构成了记录的细节,根据记录的内容将其拆分为选项卡。有些记录可能只有一个标签,而其他较大的标签则有多个标签。因此,应该在子类级别和this example.

实例化JTabbedPane的内容

底部是我们搜索该类型记录的地方。例如,在发布的链接中,打开了用户管理器JInternalFrame。然后,我们将根据用户名和/或用户ID搜索用户。结果显示在下表中,双击搜索结果,记录显示在JTabbedPane的上方。

然后使用添加,保存,删除和取消按钮对输入到记录中的任何内容执行CRUD操作。

由此可以说,设计的各个方面需要通过子类实例化:

1)JInternaFrame的大小 2)JTabbedPane的所有内容:没有tabes,表格,标签,文本框等。 3)搜索结果JTable中的列数:我们可以通过实例化JTable标头来改变它。

首先,我尝试使用JTabbedPane创建一个Abstract类,并将组件添加到JTabbedPane以查看我可以如何处理它。这是我之前发布的代码。这个文件是使用WindowBuilder生成的,我后来修改了它:

package zm.co.freight.fpsManagementGUI.view;

import java.awt.EventQueue;

public abstract class AbstractTypeInternalFrame extends JInternalFrame {

    /**
     * Launch the application.
     */
//  public static void main(String[] args) {
//      EventQueue.invokeLater(new Runnable() {
//          public void run() {
//              try {
//                  AbstractTypeInternalFrame frame = new AbstractTypeInternalFrame();
//                  frame.setVisible(true);
//              } catch (Exception e) {
//                  e.printStackTrace();
//              }
//          }
//      });
//  }

    /**
     * Create the frame.
     */
    public AbstractTypeInternalFrame(String title) {
        setBounds(100, 100, 808, 589);

        JToolBar toolBar = new JToolBar();
        getContentPane().add(toolBar, BorderLayout.NORTH);

        JButton btnAdd = new JButton("Add");
        toolBar.add(btnAdd);

        JButton btnSave = new JButton("Save");
        btnSave.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });
        toolBar.add(btnSave);

        JButton btnDelete = new JButton("Delete");
        toolBar.add(btnDelete);

        JButton btnCancel = new JButton("Cancel");
        btnCancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        toolBar.add(btnCancel);

        JTabbedPane recordTabs = new JTabbedPane(makeRecordTabPane());
        getContentPane().add(recordTabs, BorderLayout.NORTH);

        JSeparator recordSearchSeparator = new JSeparator();
        getContentPane().add(recordSearchSeparator, BorderLayout.NORTH);



    }

    protected abstract int makeRecordTabPane();

}

问题是,我是否走在正确的轨道上?我应该如何使用工厂方法模式来处理它,因为我似乎并没有很好地掌握它。我已经看到了更简单的例子,包括形状和图纸,但是使用Swing接口有点丢失了。有没有一个很好的例子可以指导我或一个简单的例子只是为了指出我正确的方向......这就是我所要求的。对不起,如果它含糊不清......