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