JavaSwing将GUI与业务逻辑分开

JavaSwing将GUI与业务逻辑分开,java,swing,Java,Swing,我想在Java应用程序中将业务逻辑与GUI分开。 在当前阶段,我的应用程序运行良好,但initialize()中有很多业务逻辑代码: 因此,我决定将业务逻辑移到另一个函数中,并在init之后执行它,方式如下: public class FGUI { /** * Launcher */ public void runGui(BusinessLogicData model) { EventQueue.invokeLater(new Runnable() { public

我想在Java应用程序中将业务逻辑与GUI分开。 在当前阶段,我的应用程序运行良好,但initialize()中有很多业务逻辑代码:

因此,我决定将业务逻辑移到另一个函数中,并在init之后执行它,方式如下:

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);
}
结果如何? 尽管数据结构填充正确,但GUI仍然是空的,因为我只执行了initialize函数

这是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);

}
private void initialize(){
//初始化列表模型
oh_listModel=新的DefaultListModel();
ph_listModel=新的DefaultListModel();
//业务逻辑功能
fillJTreeOH(模型,“根树”);
fillJTreePH(模型,“RootTreeP”);
this.frame=新的JFrame();
机架立根(100450300);
JMenuBar menuBar=新的JMenuBar();
frame.setJMenuBar(菜单栏);
JMenuItem quit=新的JMenuItem(“quit”);
mnNewMenu.add(退出);
oh_panel=新的JPanel();
frame.getContentPane();
oh_panel.setLayout(新的MigLayout(“,”[grow]”,“[grow]”);
oh_scrollPane=新的JScrollPane();
添加(滚动窗格,“单元格0,增长”);
oh_树=新JTree(ohModel);
oh_tree.setVisibleRowCount(8);
//彩色图标
//setCellRenderer(新的FMyTreeRenderer(模型));
oh_滚动窗格。setViewportView(oh_树);
}
以及填充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);
}
private void fillJTreeOH(BusinessLogicData模型,字符串根名称)
{
DerivedModel dht=model.getDerivedHierarchyTypes();
HashMap treeHashMap=model.getTreeDerivation().getCollectionDefaultMutableNode();
put(rootName,新的DefaultMutableTreeNode(rootName));
ohModel=newDefaultTreeModel(treeHashMap.get(rootName));
TraversalAction动作=新建TraversalAction(){
@凌驾
公共void执行(TreeNode节点){
//根
if(node.parent()==null)
{
ohModel=newDefaultTreeModel(treeHashMap.get(rootName));
}
//直接的
其他的
{
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());
添加(子节点);
}
//后代
}
@凌驾
公共布尔值已完成(){
return false;//返回true以停止遍历
}
};
//从第一个节点(根节点)开始遍历每个节点
getHierarchyTree().get(0).traversePreOrder(操作);
}
换句话说,JTree oh_树必须在fillGui函数中更新,但它没有显示任何内容


这是正确的方法吗?

请共享实际的业务逻辑代码。您的示例不完整。对不起,我现在已修复。
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);
}