如何跟踪Java应用程序中的所有组件?

时间:2015-10-08 17:36:46

标签: java oop javafx

我更了解它是如何在现实世界中完成的。

我正在Javafx中构建一个应用程序,它正在使用webview在网页中监听INPUT。当用户单击输入时,会创建一个新按钮(“输入单击”)并将其添加到底部的GridPane中。然后,用户可以单击该按钮,将出现一个对话框,以显示信息,如输入ID,类,值等。

如果网页有10个以上的输入,那么如何跟踪所创建的所有新Button()?我写信给文件吗?我创建了一个arraylist吗?如果是这样,如果用户关闭应用程序怎么办?如何重新创建GridPane,几乎就像File-> Save功能一样?

我附上了该应用程序的图像。如您所见,我点击了谷歌搜索INPUT 4次,创建了4个按钮。每个人都需要独一无二。如果我关闭应用程序,则需要重新创建它。

代码就是

mainGrid.add(new Button("Input Clicked",IncrementCol,IncrementRow);

Example

3 个答案:

答案 0 :(得分:2)

跟踪输入控件的一种方法是通过名为“Model-View-Controller”的模式。输入控件的状态在模型中捕获,您可以保留然后稍后恢复。

像这样的东西。 UI类结合了ViewJTextFieldJLabel等)和ControllerActionListener)。您可能希望在足够大的UI中将这些分成不同的类。 Model类保留所有状态,ControllerViewModel之间切换。

这使您可以跟踪UI中的内容。

public UI extends JFrame {
    private Model model;
    private JTextField fn;
    private JTextField ln;
    private JLabel n;

    public JFrame(Model model) {
        this.model = model;
        fn = JTextField(model.getFirstName());
        ln = JTextField(model.getLastName());
        n = new JLabel(model.getFullName());
        JButton b = new JButton("Submit");
        JButton s = new JButton("Save");
        JButton r = new JButton("Restore");
        b.setActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                model.setFirstName(fn.getText());
                model.setLastName(ln.getText());
                n.setText(model.getFullName());
            }
        });
        s.setActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                model.save();  
            }
        });
        r.setActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                model.load();  
                fn.setText(model.getFirstName());
                ln.setText(model.getLastName());
                n.setText(model.getFullName());                  
            }
        });
        add(fn);
        add(ln);
        add(l);
        add(b);
        add(s);
        add(r);
    }
}

public class Model {
    private firstName;
    private lastName;
    private fullName;

    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName; update(); }
    public String getLastName() { return firstName; }
    public void setLastName(String firstName) { this.firstName; update(); }
    public String getFullName() { return fullName; }
    public void update() { this.fullName = firstName + " " + lastName }

    public void save() {
        try(PrintWriter w = new PrintWriter(new FileWriter("c:/temp/test.txt"))) {
           w.println(firstName);
           w.println(lastName);
        }
    }

    public void load() {
       try(Scanner s = new Scanner(new FileReader("c:/temp/test.txt"))) {
          firstName = s.next();
          lastName = s.next();
          update();
       }
    }
}

答案 1 :(得分:0)

如果您的Buttons / GridPane是Serializable,您可以选择一个也可序列化的列表实现(如ArrayList),然后在用户添加按钮或关闭应用程序时将其序列化为文件。然后,反序列化可以轻松重建已保存的状态。

答案 2 :(得分:0)

创建模型对象,如简单的JavaBean,以包含状态和数据。这些对象不应该是JavaFC类,只是您创建的简单类。您可以根据需要将这些序列化为文件。我为JavaFX应用程序编写了很多代码,我可以证明可以在Web部署的JavaFX上写入文件,尽管有一些可以跳转的东西。

您可以将保存的对象存储在内存中的自定义域特定上下文或管理器单例中(例如AccountManager.getInstance()AccountnContext.getInstance())。这些单例对象将在启动时或根据请求查询序列化对象。您可以拥有一个序列化类来管理对象到磁盘的所有消毒。也许它需要文件的名称和对象类型,并将保存或检索它。单例将保留并提供对JavaBean对象的访问。

编辑:只是为了添加@ sh0rug0ru的答案,我的答案集中在MVC的模型方面。模型负责包含域特定对象的状态,值和消除。