Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Javafx - Fatal编程技术网

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

如何跟踪Java应用程序中的所有组件?,java,oop,javafx,Java,Oop,Javafx,我更感兴趣的是了解它在现实世界中是如何实现的 我正在用Javafx构建一个应用程序,它正在使用webview在网页中收听输入。当用户单击输入时,将创建一个新按钮(“单击输入”),并将其添加到底部的网格窗格中。然后,用户可以单击该按钮,将出现一个对话框,显示输入ID、类、值等信息 如果一个网页有10多个输入,那么如何跟踪创建的所有新按钮?我要写文件吗?我是否创建arraylist?如果是这样,如果用户关闭应用程序怎么办?如何重新创建GridPane,就像文件->保存功能一样 我已经附上了应用程序的

我更感兴趣的是了解它在现实世界中是如何实现的

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

如果一个网页有10多个输入,那么如何跟踪创建的所有新按钮?我要写文件吗?我是否创建arraylist?如果是这样,如果用户关闭应用程序怎么办?如何重新创建GridPane,就像文件->保存功能一样

我已经附上了应用程序的图像。如你所见,我已经点击谷歌搜索输入4次,创建了4个按钮。每一个都必须是独一无二的。如果我关闭应用程序,它需要重新创建它

代码很简单

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

如果按钮/网格窗格是可序列化的,则可以选择一个也可序列化的列表实现(如ArrayList),然后在用户添加按钮或关闭应用程序时将其序列化到文件中。然后,反序列化允许轻松重建保存的状态。

跟踪输入控件的一种方法是通过名为“”的模式。输入控件的状态被捕获到模型中,您可以将其持久化,然后在以后恢复

像这样的。
UI
类将
视图
JTextField
JLabel
等)和
控制器
ActionListener
)。您可能希望在一个足够大的UI中将它们划分为不同的类。
模型
类保存所有状态,
控制器
视图
模型
之间切换

这允许您跟踪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();
       }
    }
}

创建模型对象,如简单JavaBean,以包含状态和数据。这些对象不应该是JavaFC类,而应该是您创建的简单类。您可以将这些文件序列化为您认为合适的文件。我为JavaFX应用程序编写了大量代码,我可以证明,在web部署的JavaFX上写文件是可能的,尽管有一些困难需要解决

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


编辑:为了补充@sh0rug0ru的答案,我的答案集中在MVC的模型方面。该模型负责包含特定于域的对象的状态、值和消毒

我很难在没有图片的情况下可视化您的应用程序。通常,我为每个面板创建一个类。有时,如果面板比较复杂,我会为面板的一部分创建一个类。在创建GUI时,您应该使用来分离关注点。如果您试图为特定用户保存信息,我建议使用某种数据存储。无论是文件、数据库还是本地密钥/值存储。但是,您仍然需要将这些“创建的按钮”映射到特定的用户/会话,因此在设计要使用的数据结构时也要记住这一点。您对“跟踪所有组件”的定义真的很难理解。是否要保留/保存数据?你想记录什么吗?调试?监视器?我希望能够使用该组件。例如,如果用户添加了4个按钮,然后用户想要删除其中一个,我怎么知道他/她选择了删除哪个按钮?您的问题太模糊了,但似乎您需要在应用程序中创建一些数据表示(URL列表?不确定)。那么您的UI就是这些数据的视图。保存数据,从列表中删除项目,等等,只要安排视图总是在数据更改时更新就行了。但是如果JTextField不固定怎么办?如果我需要动态创建和删除JTextField呢?你是如何在模型中实现的?在模型中,可能是一个列表。控制器中的一些逻辑将决定视图需要一个新的JTextField,并且需要告诉模型向列表中添加一些内容。然后,控制器的工作就是知道如何在值列表和列表中的项所属的JTextField之间交换数据。也许您可以在控制器中保留JTextField对象的列表?只需记住如何在模型、视图和控制器之间划分职责,这应该是有意义的。