2015-09-28 47 views
0

我正在使用Java和SWT開發GUI應用程序。
我已經創建了一個帶有畫布的主窗口,其中我加載了一個圖像(以及它轉換爲圖像的PDF頁面)。
我已將PaintListener附加到畫布上,並且當我將鼠標拖放到畫布上時,我可以繪製矩形。
當我釋放鼠標左鍵時,我想要一個對話窗口來「精細設置」矩形區域,所以我做了一個4微調(x,y,寬度和高度)的對話框。
現在我想單擊旋鈕,畫布重新繪製更改後的矩形區域。
我試圖將畫布對象傳遞給對話窗口並附加第二個畫筆偵聽器(所以我有一個來自MainWindow.java的paintlistener和另一個來自Dialog.java),但它沒有用。
問題是我在畫布上繪製了多個矩形,如果我從對話框窗口調用canvas.redraw(),已經在畫布上繪製的矩形「消失」了。

這種情況下的最佳做法是什麼?
我認爲把對話窗口放在「工具欄」中,即將4個旋鈕放在工具欄中(或主窗口中的另一個區域),這樣我只有一個畫筆偵聽器並擺脫對話框,但我更喜歡該對話框導致將矩形拖到畫布上然後移動鼠標以在工具欄上單擊是不切實際的。

在此先感謝,莫羅來自對話框的Java SWT更新畫布

回答

0

你的主窗口中應該實現,例如定製的監聽器:

public interface PreferencesListener { 
    public void updatePreference(PreferencesEvent e) 
} 

然後創建其控制的更新管理器:

public class PreferencesController { 

     private static PreferencesController instance = new PreferencesController(); 
     private List<PreferencesListener> preferencesListeners; 

     private PreferencesController() { 
      preferencesListeners = new ArrayList<PreferencesListener>(); 
     } 

     public static PreferencesController getInstance() { 
      return instance; 
     } 

     public void addPreferenceListener(PreferencesListener listener) { 
      preferencesListeners.add(listener); 
     } 

     public void notify(int x, int y, int w, int h) { 
      PreferencesEvent e = new PreferencesEvent(x, y, w, h); 
      for(final PreferencesListener listener: preferencesListeners) { 
       listener.updatePreference(e); 
      } 
     } 
    } 

在創造主的那一刻窗口將其註冊到控制器中:

PreferencesController.getInstance().addPreferenceListener(this); 

當您更改對話框觸發值通知:

PreferencesController.getInstance().notify(x,y,w,h); 

然後終於實現從PreferencesListener updatePreference(PreferencesEvent E)。從這個時刻開始,每當值x y w h發生變化時,您的窗口將會被通知。從我的角度來看,這是一個很好的解決方案,因爲您的窗口和對話框甚至不知道彼此存在,並且您可以輕鬆添加對首選項更改有反應的其他組件。

+0

我對此沒有太多瞭解。我必須擴展PaintListener?在你的例子中,接口PreferencesListener是我的「PaintListenerExtended」?而PreferencesController類是「經理」?我看到我必須創建一個PreferencesEvent類,對嗎? – MauroGiaco78

+0

否。您的MainWindow正在實施/擴展PreferencesListener。之後,它可以註冊自己以偵聽對PreferencesController/PreferencesManager的配置更改。 PaintListener在這個領域是無關緊要的。在您的對話框觸發方法updatePreference中採取行動。在MainWindow中重寫updatePreference()應該執行canvas.redraw()。 PaintListener保持原樣。 – Kuba

+0

對不起,但我找不到關於PreferencesListener的任何文檔。也許我沒有正確理解你的代碼示例中的含義。 – MauroGiaco78