2012-08-08 59 views
1

我有我製作的程序選擇工具。它用17個按鈕打開一個JFrame,其中15個是可定製的,他們從位於C:驅動器中的.txt文檔獲取文本。當我點擊分配按鈕時,它會打開一個JFileChooser來選擇一個文件,當點擊該按鈕時打開。然後選擇一個按鈕進行更改,然後鍵入您想要按鈕顯示的文本。之後,程序將重寫.txt文件並更新按鈕。這裏是更新代碼:爲什麼我的背景在重新粉刷後出現毛刺?

public static void restart() { 
    start.assignButtonActions(); 
    start.assignButtonText(); 
    start.paint(graphics); 
} 
public void assignButtonActions() { 
    /** 
    * assign button actions 
    */ 
    for (int i = 0; i < buttonAction.length; i++) { 
     buttonAction[i] = io.readSpecificFromHD("C:\\ButtonActions.txt", i 
       + 1 + actionButton.length); 
    } 
} 

public void assignButtonText() { 
    for (int i = 0; i < actionButton.length; i++) { 
     /** 
     * set button text 
     */ 
     actionButton[i].setText(io.readSpecificFromHD(
       "C:\\ButtonActions.txt", i + 1)); 
    } 

} 
public void paint(Graphics g) { 
    g.drawImage(getImage("files/background.png"), 0, 0, FRAMEWIDTH, 
      FRAMEHEIGHT, null); 
    refresh(); 
} 

public void refresh() { 
    graphics.drawImage(getImage("files/background.png"), 0, 0, FRAMEWIDTH, 
      FRAMEHEIGHT, null); 
    for (int i = 0; i < actionButton.length; i++) { 
     actionButton[i].repaint(); 
    } 
    assignButton.repaint(); 
    helpButton.repaint(); 
} 

那就是我相信這個問題所需的所有代碼。問題是,調用方法restart()後,背景在那裏,按鈕周圍有一個白色正方形,在正方形內部是白色的。不是真正的主要問題,但真正令人難以置信的煩人和非常不專業。起初我認爲這是按鈕的背景被繪製後調整大小,所以我做了這樣的刷新每次運行兩次它的調用。沒有幫助一點。編號: 我修正了這個問題。我採取了氣墊船的答案,並修改了我學到的一點點。我所要做的就是修改restart()方法:

public static void restart() { 
    start.assignButtonActions(); 
    start.assignButtonText(); 
    start.repaint(); 
} 

因爲repaint();重繪整個組件這是說的氣墊船。謝謝大家!希望這有助於未來的問題。

+0

幻數無處不在(魔弦太) – Wug 2012-08-08 21:16:42

回答

4

您似乎是通過直接調用paint(...)錯誤地處理Swing圖形,並試圖在JComponent的paintComponent(...)方法外使用Graphics對象。不要這麼做,因爲所有的Swing圖形教程都會告訴你(如果你還沒有經歷其中的一些,那麼你很快就會這麼做)。相反,在JComponent(例如JPanel的)paintComponent(...)內的所有圖形中,先調用super的方法,然後在paintComponent的方法參數中使用由JVM提供的Graphics對象。

編輯
教程鏈接:

我在想你必須重新編寫大部分圖形代碼。您應該進行的更改:

  • 僅在JPanel或其他JComponent派生類中繪製,而不是在JFrame或其他頂級窗口中繪製。
  • 在你的班級的paintComponent(...)方法中繪製。
  • 在您的paintComponent(...)方法的正上方放置一個@Override註釋,以確保您實際上覆蓋了超級方法。
  • 致電超級的paintComponent(...)作爲您的paintComponent(...)覆蓋方法的第一行(通常)。
  • 使用由JVM傳遞給此方法的Graphics對象。
  • 請勿在組件上使用通過調用getGraphics()獲得的Graphics對象(極少數情況除外)。
  • 不要給你的類一個Graphics字段,並嘗試在其中存儲Graphics對象。由JVM給出的Graphics對象不會持久,並且很快會變爲空或不可用。
  • 請不要自己直接撥打paint(...)paintComponent(...)(極少數例外情況 - 您目前的代碼不符合其中一項例外情況,請相信我)。
  • 你可能不需要調用repaint()您Jbutton將
+1

我同意。在所有JButton上也不需要調用repaint。 – mercutio 2012-08-08 21:18:06

+0

@mercutio:正好! – 2012-08-08 21:19:38

+0

即時通訊不知道你的意思....如果你的意思是我應該使用JFrame油漆,那麼我,然後回顧它。我現在改了它,而不是'start.paint(圖形);'到'start.repaint();'它有相同的問題。我在這個假設中正確嗎? – PulsePanda 2012-08-09 00:56:42