0

我有使用扩展 ViewPart 的视图的 eclipse 插件。ViewPart 有一个需要 IMemento 的 saveState 方法。我将我的代码添加到 saveState 和相应的 init-Method 并且它可以工作。

我创建了 3 个哈希图。

1) hmTextONLY: 它只包含文本值。(列名(ColumnIndex):Threarname(1),categoryname(2),description(5),justification(6))

2)hmCOMBO1ONLY:它只包含combobox1值。(列名(列索引):状态(3))

3)hmCOMBO2ONLY:它只包含combobox2值。(列名(列索引):优先级(4))

这里的方法描述,在代码中使用。

init:初始化视图。

createPartControl:在视图部分创建表。

fillRows:表格中的数据,来自这个方法。一行一行。saveState:此方法对保存数据很有用。仅在整个工作区关闭时才调用 saveState。

saveState:用于在关闭应用程序时保存工作区。

问题: 1)如何使用保存状态方法顺序保存整个表数据(文本混合,组合框)?我在 saveState 方法中创建了一个子表单 Id1。

代码:

public class Theartview extends ViewPart implements Serializable {

Table table;
private TableViewer tableViewer;
TableViewerColumn tableViewerColumn;
TableColumnLayout tableColumnLayout;
private HashMap<Integer, String> hmTextONLY = new HashMap<>();
private HashMap<Integer, String> hmCOMBO1ONLY = new HashMap<>();
private HashMap<Integer, String> hmCOMBO2ONLY = new HashMap<>();
private static Integer hmT = 0, hmC1 = 0, hmC2 = 0;
private IMemento memento;
private Text text_1, text_2, text_3, text_4;

public void createPartControl(Composite parent) {

    Composite tableComposite = new Composite(parent, SWT.NONE);
    tableColumnLayout = new TableColumnLayout();
    tableComposite.setLayout(tableColumnLayout);
    tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
            true));

    tableViewer = new TableViewer(tableComposite, SWT.MULTI | SWT.H_SCROLL
            | SWT.V_SCROLL);
    tableViewer.setContentProvider(ArrayContentProvider.getInstance());
    // TODO viewer.setLabelProvider(new ViewLabelProvider());
    table = tableViewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    String[] titles = { "Threat Name", "Category Name", "Status",
            "Priority", "Description", "Justification" };

    for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
        tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        TableColumn tblclmn = tableViewerColumn.getColumn();
        tableColumnLayout.setColumnData(tblclmn, new ColumnPixelData(200,
                true, true));
        tblclmn.setText(titles[loopIndex]);
    }

    if (memento != null) {
        System.out.println("Entering Restore State");
        restoreState(memento);
    }

    memento = null;

  }

   private void fillRows(String shortdesc, String categ, String descp) {
       TableItem ramtableitem = new TableItem(table, SWT.NONE);

       // for Threat_Name
       TableEditor editorTN = new TableEditor(table);
       text_1 = new Text(table, SWT.NONE);
       editorTN.grabHorizontal = true;
       editorTN.setEditor(text_1, ramtableitem, 0);
       text_1.setText(shortdesc);
       Theart_Name = text_1.getText();
       hmTextONLY.put(hmT++, Theart_Name);

       // For Category_Name
        TableEditor editorCN = new TableEditor(table);
        text_2 = new Text(table, SWT.NONE);
        editorCN.grabHorizontal = true;
        editorCN.setEditor(text_2, ramtableitem, 1);
        text_2.setText(categ);
        Category_Name = text_2.getText();
        hmTextONLY.put(hmT++, Category_Name);

         String items[] = { "Mitigated", "Not Applicable", "Not Started",
            "Needs Investigation" };
        Arrays.sort(items);

        final CCombo Status_Combo = new CCombo(table, SWT.NONE);
        Status_Combo.setItems(items);
        TableEditor editor = new TableEditor(table);
        editor.grabHorizontal = true;
        editor.setEditor(Status_Combo, ramtableitem, 2);

        Status_Combo.addSelectionListener(new SelectionListener() {
          public void widgetSelected(SelectionEvent e) {
             Status_Name = Status_Combo.getText();
            hmCOMBO1ONLY.put(hmC1, Status_Name);
         }

        public void widgetDefaultSelected(SelectionEvent e) {               
            Status_Name = Status_Combo.getText();               
            hmCOMBO1ONLY.put(hmC1, Status_Name);
            }
        });


       // For Priority_Name
    String itemss[] = { "High", "Medium", "Low" };
    Arrays.sort(itemss);
    final CCombo Priority_Combo = new CCombo(table, SWT.NONE);
    Priority_Combo.setItems(itemss);
    TableEditor editorP = new TableEditor(table);
    editorP.grabHorizontal = true;
    editorP.setEditor(Priority_Combo, ramtableitem, 3);

    Priority_Combo.addSelectionListener(new SelectionListener() {
        public void widgetSelected(SelectionEvent e) {
            System.out.println(Priority_Combo.getText());
            Priority_Name = Priority_Combo.getText();
            hmCOMBO2ONLY.put(hmC2, Priority_Name);
        }

        public void widgetDefaultSelected(SelectionEvent e) {
            System.out.println(Priority_Combo.getText());
            Priority_Name = Priority_Combo.getText();
            hmCOMBO2ONLY.put(hmC2, Priority_Name);
        }
    });
      // For Descrption_Name
        TableEditor editorDN = new TableEditor(table);
        text_3 = new Text(table, SWT.NONE);
        editorDN.grabHorizontal = true;
        editorDN.setEditor(text_3, ramtableitem, 4);
        text_3.setText(descp);
        Descrption_Name = text_3.getText();
        hmTextONLY.put(hmT++, Descrption_Name);

        // For justification
        TableEditor editorJ = new TableEditor(table);
        text_4 = new Text(table, SWT.MULTI | SWT.BORDER | SWT.WRAP
            | SWT.V_SCROLL);
         editorJ.grabHorizontal = true;
        editorJ.setEditor(text_4, ramtableitem, 5);
        Justification_Name = text_4.getText().toString().trim();
        hmTextONLY.put(hmT++, Justification_Name);
   }

public void saveState(IMemento memento) {
     super.saveState(memento);
    for (int s = 0; s <= hmTextONLY.size(); s++) {
    for (int su = 0; su <= hmCOMBO1ONLY.size(); su++) {
     for (int sum = 0; sum <= hmCOMBO2ONLY.size(); sum++) {
                IMemento mem = memento.createChild(ID1 + "s");
                mem.putString(ID1 + "s", hmTextONLY.get(s));
             }
        }
     }


public void init(IViewSite site, IMemento memento) throws PartInitException{
     super.init(site, memento);
    this.memento = memento;
    System.out.println("Intialize the view");

 }


 }

}

上述代码的当前输出:

4

1 回答 1

0

IMemento只要可以序列化为字符串和原语,就可以保持任意状态。您需要编写代码,将视图状态(例如列宽、选择等)与给定IMemento实例相互转换。

为了结构化要存储的数据,还可以嵌套备忘录。使用createChild(), 创建子纪念品。

视图具有生命周期方法,即init()saveState()何时调用

  • 视图已初始化,备忘录中的状态应应用于视图
  • 视图即将关闭,其状态应存储在备忘录中。

此 wiki 页面提供了更多详细信息,还列出了使用纪念品的替代方法:https ://wiki.eclipse.org/FAQ_How_does_a_view_persist_its_state_between_sessions%3F

于 2016-09-27T08:55:12.260 回答