2011-11-18 21 views
0

當我從my previous question瞭解到之後,我想使用紋理在正在按下時擴展JButton上的文本。第一步是設置按鈕的ChangeListener和stateChanged方法;我有這些工作,並可以在該方法中設置前景色,以便文本將是一個顏色,而按鈕的按下,而另一個沒有。將JButton重繪限制爲狀態更改?

在此基礎上構建的,我將setForeground調用替換爲我用於toggleButtons的drawString代碼。它可以工作,但是在繪製文本之後立即被自動重新繪製的按鈕覆蓋。我嘗試在「while(model.isPressed())」循環中拋出代碼,但是這有一些非常糟糕的結果(系統掛起)。我將如何去手動重繪我的按鈕,以便它只在stateChanged方法中重繪?

+1

你的問題是在理論上的高度,請張貼代碼來證明你的問題與JButton,在http://sscce.org/表格 – mKorbel

+0

我的JButton的確正在做它的意義;我只是在徵求意見,因爲我不知道如何處理我想要做的修改。 – bendicott

回答

2

在我看來,你會錯誤地改變按鈕的外觀。我認爲創建一個處理按鈕外觀的類會更容易,而不是手動處理按鈕代碼中的按鈕繪圖參數。阻止repaint()電話不是真正的方式去我相信你的情況。

我會親自創建自己的ButtonUI實施,將處理所有的塗料規則(基於例如按鈕狀態前景色),那麼我會呼籲按鈕setUI,指定的這個新ButtonUI實例作爲參數。如果你不想處理所有繪圖的東西,你可以隨時使用你的新類作爲按鈕已經存在的UI處理器的代理(通過JButton的getUI()方法),並且只在需要它們的地方進行更改(我沒有測試它自己,但我很確定它會工作得很好)。

當然,這代表了更多的代碼,但它將本地化​​您的外觀和感覺處理在一個類中,並且它將適合Swing的工作方式。網上有幾個資源可幫助您入門(here,herehere)。

+0

+1,但'ButtonUI'將是'Laf'(不包括Windows Native操作系統)敏感 – mKorbel

+0

@mKorbel如果僅將其用作代理,並且在UIDefaults類中定義某些默認值,或者指定任何其他指定方式你的配色方案。但是,您需要小心,以確保您的應用程序不會在其他外觀和感覺上顯得無聊(如果這是您的應用程序中的任何問題)。 – Laf

+0

感謝您的建議;我從來沒有深入研究過ButtonUI,但我會看看鏈接並回復一下 – bendicott