Browse Source

REPORT-44961 【10.0.12冒烟】附件模板打开设计器卡死,且布局发生变化

【问题原因】带有数据字典的设计器控件,在选中的时候会去连接获取字段信息,当系统中有同名数据连接但是无法连接到数据库的时候,会发生假死。如果没有这个数据连接的名字,那么会直接报错不会假死。主要还是这个数据字典获取数据的操作是耗时操作,不应该在UI线程进行耗时操作。
【改动方案】主要分为两部分,第一是将原本的tdChange()方法中的耗时操作放到SwingWorker中的工作线程中,这样的话即使后台数据连接失败,设计器也不会一直阻塞直到重连超时;第二是应产品的要求,将选中控件就会去请求连接并获取属于当前控件的列名这部分逻辑,修改为用户点击右侧面板中的数据字典旁边的button,showDictPane的时候才会去请求连接
research/11.0
Yvan 4 years ago
parent
commit
9b71b1241e
  1. 4
      designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java
  2. 1
      designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleDictionaryEditor.java
  3. 4
      designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java
  4. 59
      designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java

4
designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java

@ -7,6 +7,7 @@ import com.fr.design.DesignModelAdapter;
import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.preview.PreviewTablePane; import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode;
import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignUtils;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
@ -62,7 +63,8 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
embeddedTableData = DesignTableDataManager.previewTableDataNotNeedInputParameters(tds, tabledata, TableData.RESULT_NOT_NEED, false); embeddedTableData = DesignTableDataManager.previewTableDataNotNeedInputParameters(tds, tabledata, TableData.RESULT_NOT_NEED, false);
} catch (Exception e) { } catch (Exception e) {
if (e.getMessage()!=null) { if (e.getMessage()!=null) {
DesignUtils.errorMessage(e.getMessage()); // 这个弹窗可能会成为数据字典页面的二级弹窗,所以修改下父窗口避免出现mac下的二级弹窗问题
FineJOptionPane.showMessageDialog(null, e.getMessage());
} }
} }
columnNameList = DesignTableDataManager.getColumnNamesByTableData(embeddedTableData); columnNameList = DesignTableDataManager.getColumnNamesByTableData(embeddedTableData);

1
designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleDictionaryEditor.java

@ -21,6 +21,7 @@ public class AccessibleDictionaryEditor extends UneditableAccessibleEditor {
protected void showEditorPane() { protected void showEditorPane() {
if (dictPane == null) { if (dictPane == null) {
dictPane = new DictionaryPane(); dictPane = new DictionaryPane();
dictPane.getTableDataDictPane().setNeedTableDataChange(true);
} }
BasicDialog dlg = dictPane.showWindow(SwingUtilities.getWindowAncestor(this)); BasicDialog dlg = dictPane.showWindow(SwingUtilities.getWindowAncestor(this));

4
designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java

@ -83,4 +83,8 @@ public class DictionaryPane extends UIComboBoxPane<Dictionary> implements DataCr
public void registerDSChangeListener() { public void registerDSChangeListener() {
tableDataDictPane.registerDSChangeListener(); tableDataDictPane.registerDSChangeListener();
} }
public TableDataDictPane getTableDataDictPane() {
return tableDataDictPane;
}
} }

59
designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java

@ -32,6 +32,7 @@ import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -41,7 +42,9 @@ import javax.swing.event.ChangeListener;
import java.awt.*; import java.awt.*;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException;
/** /**
* 数据字典的数据查询面板 * 数据字典的数据查询面板
@ -60,6 +63,8 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
private DoubleDeckValueEditorPane valueDictPane; private DoubleDeckValueEditorPane valueDictPane;
private ItemListener itemListener; private ItemListener itemListener;
private UIObserverListener uiObserverListener; private UIObserverListener uiObserverListener;
private FormulaEditor formulaEditor1 = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula"));
private boolean needTableDataChange = false;
public TableDataDictPane() { public TableDataDictPane() {
initBasicComponets(); initBasicComponets();
@ -67,6 +72,10 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
iniListener(); iniListener();
} }
public void setNeedTableDataChange(boolean needTableDataChange) {
this.needTableDataChange = needTableDataChange;
}
public static void main(String[] args) { public static void main(String[] args) {
JFrame jf = new JFrame("test"); JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@ -83,7 +92,7 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
tableDataNameComboBox.addItemListener(new ItemListener() { tableDataNameComboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) { if (e.getStateChange() == ItemEvent.SELECTED) {
tdChange(e); tdChange(e, needTableDataChange);
} }
} }
}); });
@ -153,13 +162,37 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dic_Data_Query"); return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dic_Data_Query");
} }
private void tdChange(final ItemEvent e) { private void tdChange(final ItemEvent e, boolean needTableDataChange) {
TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem(); TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem();
if (tableDataWrappe == null) { if (tableDataWrappe == null) {
return; return;
} }
if (itemListener != null) {
itemListener.itemStateChanged(e);
formulaEditor1.addChangeListener(event -> {
itemListener.itemStateChanged(e);
});
}
if (needTableDataChange) {
changeColumnsName();
}
}
private void changeColumnsName() {
TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem();
SwingWorker<List<String>, Object> worker = new SwingWorker<List<String>, Object>() {
@Override
protected List<String> doInBackground() throws Exception {
if (tableDataWrappe == null) {
return new ArrayList<>();
}
return tableDataWrappe.calculateColumnNameList();
}
List<String> namelist = tableDataWrappe.calculateColumnNameList(); @Override
protected void done() {
try {
List<String> namelist = get();
String[] columnNames = null; String[] columnNames = null;
if (!namelist.isEmpty()) { if (!namelist.isEmpty()) {
columnNames = namelist.toArray(ArrayUtils.EMPTY_STRING_ARRAY); columnNames = namelist.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
@ -172,25 +205,19 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
columnIndexEditor1.addItemListener(itemListener); columnIndexEditor1.addItemListener(itemListener);
keyColumnPane.setEditors(new Editor[]{columnNameEditor1, columnIndexEditor1}, columnNames[0]); keyColumnPane.setEditors(new Editor[]{columnNameEditor1, columnIndexEditor1}, columnNames[0]);
FormulaEditor formulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula")); formulaEditor1.setEnabled(true);
formulaEditor.setEnabled(true);
formulaEditor.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent ee) {
if (itemListener != null) {
itemListener.itemStateChanged(e);
}
}
});
ColumnNameEditor columnNameEditor2 = new ColumnNameEditor(columnNames); ColumnNameEditor columnNameEditor2 = new ColumnNameEditor(columnNames);
columnNameEditor2.addItemListener(itemListener); columnNameEditor2.addItemListener(itemListener);
ColumnIndexEditor columnIndexEditor2 = new ColumnIndexEditor(columnNames.length); ColumnIndexEditor columnIndexEditor2 = new ColumnIndexEditor(columnNames.length);
columnIndexEditor2.addItemListener(itemListener); columnIndexEditor2.addItemListener(itemListener);
valueDictPane.setEditors(new Editor[]{columnNameEditor2, columnIndexEditor2, formulaEditor}, columnNames[0]); valueDictPane.setEditors(new Editor[]{columnNameEditor2, columnIndexEditor2, formulaEditor1}, columnNames[0]);
if (itemListener != null) { } catch (InterruptedException | ExecutionException e) {
itemListener.itemStateChanged(e); FineLoggerFactory.getLogger().error(e.getMessage());
}
} }
};
worker.execute();
} }
@Override @Override

Loading…
Cancel
Save