首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

RCP 應用實現多用戶個性化界面狀態持久化

     編輯:Java 相關知識

Eclipse RCP 預設將工作台狀態(視圖位置、大小、可見性)儲存於 workbench.xml,多用戶環境下會互相覆蓋。本文提供一種「山寨但有效」的方案:在 Application.start() 階段根據登入用戶動態切換配置檔,實現用戶級界面狀態隔離。

核心思路

  1. Application.start() 執行登入邏輯,取得用戶名
  2. 構建用戶專屬配置檔名:{username}_workbench.xml
  3. 啟動工作台前:若用戶配置存在,覆蓋預設 workbench.xml
  4. 工作台關閉後:將更新後的 workbench.xml 寫回用戶配置檔,刪除預設檔

關鍵代碼

public class Application implements IApplication {
    public Object start(IApplicationContext context) throws Exception {
        Display display = PlatformUI.createDisplay();
        try {
            String defaultName = "workbench.xml";
            String workBenchPath = "D:/runtime-rcptest.application/.metadata/.plugins/org.eclipse.ui.workbench/";
            String absolutePath = workBenchPath + defaultName;
            String loginUser = "SystemManager"; // 實際從登入對話框獲取
            String userCfgPath = workBenchPath + loginUser + "_" + defaultName;

            File userFile = new File(userCfgPath);
            // 啟動前:載入用戶配置
            if (userFile.isFile()) {
                copyFile(userFile, new File(absolutePath));
            }

            int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());

            // 關閉後:持久化用戶配置
            File defaultFile = new File(absolutePath);
            if (defaultFile.isFile()) {
                copyFile(defaultFile, new File(userCfgPath));
                defaultFile.deleteOnExit(); // 避免新用戶看到舊配置
            }
            return returnCode == PlatformUI.RETURN_RESTART ? IApplication.EXIT_RESTART : IApplication.EXIT_OK;
        } finally {
            display.dispose();
        }
    }

    private void copyFile(File src, File dest) throws IOException {
        try (FileInputStream fis = new FileInputStream(src);
             FileOutputStream fos = new FileOutputStream(dest)) {
            byte[] buf = new byte[fis.available()];
            fis.read(buf);
            fos.write(buf);
        }
    }
    // stop()...
}

前置設定

在 ApplicationWorkbenchAdvisor.initialize() 啟用儲存/恢復:

@Override
public void initialize(IWorkbenchConfigurer configurer) {
    super.initialize(configurer);
    configurer.setSaveAndRestore(true);
}

局限與改進方向

  • 硬編碼路徑,應透過 Platform.getStateLocation() 動態獲取
  • 檔案複製非原子操作,極端情況下可能損壞
  • 未處理並發登入(RCP 通常單用戶單實例)
  • 官方推薦方案:實作 IPerspectiveFactory + IWorkbenchPreferenceConstants 或使用 Eclipse 4 的 MWindow 模型

此方案適合快速原型、舊版 RCP 維護專案,生產環境建議遷移至標準持久化機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved