2009-06-04 68 views
2

的圖紙我必須使用圖形用戶界面元素,在一個特定的屏幕位置繪製圖片。 如果用戶選擇此圖片,則會在圖像周圍繪製邊框。 現在我們想要包含另一個邊框,用於爲用戶標識具有特定值的圖片。分裂GUI元素

目前,如果它被選中的元素看起來在他的內部狀態,然後決定如何繪製自己。

graphic.drawImage(icon, x, y, null); 
if (selected) { 
    drawBorder(); 
} 

我不喜歡在這個繪圖方法中增加另一個元素的想法。 我想過創建一個新的類,它繼承了元素的行爲並覆蓋了draw方法,但這意味着在每個繼承的類中複製整個選定的代碼。 有沒有很好的可能性,所以解決這個問題,而不創建一個子類?

回答

1

既然你這個標記與設計模式,你似乎在尋找一個面向模式的方法,我建議採取看看state pattern。維基百科頁面上的例子甚至提到在繪製GUI時保持狀態。不幸的是,這意味着你必須創建另一個具有子類和重寫方法的類。

難道這將是一些可能會發生改變?即你是否真的認爲你會在繪圖中添加新的行爲(例如,如果用戶雙擊,繪製不同類型的邊框;如果用戶單擊右鍵,更改邊框的顏色),還是這樣?如果你看到更多的行爲被添加,我認爲繼續前進,採取更多面向對象的方法是明智的。如果只是這兩種情況,我會說只是添加和else if聲明。

+0

我認爲你是對的。僅爲兩三種不同的行爲進行子類化是一種開銷,如果這種情況稍後發生變化,則可以將其更改爲更高級的方法。現在我試圖改變if else到開關,並將布爾值選擇爲一個枚舉值,以指示應該使用哪種行爲進行繪製 – Janusz 2009-06-04 19:13:02

0

你有什麼反對的if-else?

它意義不大給我創造一個全新的對象所選擇的項目,而不是在繪圖功能檢查的標誌。

0

一種可能性是讓你drawBorder()方法取參數:

private void drawBorder(boolean isSelected, boolean hasSpecialValue); 

這種方法可以判斷得出哪種類型的邊界。