Я бы хотел отделить бизнес-логику от 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, но он ничего не показывает.
Это правильный способсделать так?