Java Swing отделяет графический интерфейс от бизнес-логики - PullRequest
0 голосов
/ 03 октября 2019

Я бы хотел отделить бизнес-логику от GUI в приложении Java. На текущем этапе мое приложение работает нормально, но у меня есть много кода бизнес-логики внутри initialize () :

public class FGUI {

/**
 * Launcher
 */
public void runGui(BusinessLogicData model) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                FGUI window = new FGUI(model);
                window.frame.setSize(800, 600);
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


/**
 * Constructor
 */

public FGUI(BusinessLogicData model) {
    initialize(model); //here business logic is MIXED with the GUI
}

Итак, я решил перейти в другую функцию бизнесалогика и выполнить его после инициализации, таким образом:

public class FGUI {

/**
 * Launcher
 */
public void runGui(BusinessLogicData model) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                FGUI window = new FGUI(model);
                window.frame.setSize(800, 600);
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


/**
 * Constructor
 */

public FGUI(CustomDataModel model) {
    initialize();
    fillGUI(model);
}

Каков результат этого? Несмотря на то, что структуры данных заполнены правильно, графический интерфейс пустой, так как я выполнил только функцию инициализации.

Это бизнес-логика, смешанная внутри init:

    private void initialize() {

    //Init List models
    oh_listModel =  new DefaultListModel<String>();
    ph_listModel = new DefaultListModel<String>();


    //Business logic functions
    fillJTreeOH(model, "RootTreeT");
    fillJTreePH(model, "RootTreeP");

    this.frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);

    JMenuBar menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);

    JMenuItem quit = new JMenuItem("Quit");
    mnNewMenu.add(quit);
    oh_panel = new JPanel();
    frame.getContentPane().add(oh_panel, "cell 0 0,grow");
    oh_panel.setLayout(new MigLayout("", "[grow]", "[grow]"));

    oh_scrollPane = new JScrollPane();
    oh_panel.add(oh_scrollPane, "cell 0 0,grow");

    oh_tree = new JTree(ohModel);
    oh_tree.setVisibleRowCount(8);
    //Colored icons
    //oh_tree.setCellRenderer(new FMyTreeRenderer(model));
    oh_scrollPane.setViewportView(oh_tree);

}

И бизнес-логикафункция, которая заполняет JTree:

private void fillJTreeOH(BusinessLogicData model, String rootName)
{
    DerivedModel dht = model.getDerivedHierarchyTypes();
    HashMap<String, DefaultMutableTreeNode> treeHashMap = model.getTreeDerivation().getCollectionDefaultMutableNode();
    treeHashMap.put(rootName ,new DefaultMutableTreeNode(rootName));
    ohModel = new DefaultTreeModel(treeHashMap.get(rootName));

    TraversalAction<TreeNode<String>> action = new TraversalAction<TreeNode<String>>() {
        @Override
        public void perform(TreeNode<String> node) {
            //root
            if(node.parent()==null)
            {
                ohModel = new DefaultTreeModel(treeHashMap.get(rootName));
            }
            //direct
            else
            {
                DefaultMutableTreeNode childNode = treeHashMap.get(node.data());

                //Estraggo il padre dalla struttura dati TreeNode, usando il nome node.parent.data
                DefaultMutableTreeNode parent = treeHashMap.get(node.parent().data());
                parent.add(childNode);

            }
            //descendant
        }

        @Override
        public boolean isCompleted() {
            return false; // return true in order to stop traversing
        }
    };

    //Traverse each node starting from the first node, the root
    dht.getHierarchyTree().get(0).traversePreOrder(action);
}

Другими словами, JTree oh_tree должен быть обновлен в функции fillGui, но он ничего не показывает.

Это правильный способсделать так?

...