2017-04-25 23 views
2

我正在下棋,我想讓玩家選擇棋盤的顏色。因此我會用這個方法:如何保存JPanel的特定部分?

static void createBoard(Graphics g) { 

    Color bright = new Color(255, 225, 181); //player chooses color 
    Color dark = new Color(188, 141, 105);  //player chooses color 
    boolean darkTile = false; 

    for (int y = spaceY; y < (spaceY + BOARDHEIGHT); y += TILESIZE) { 
     for (int x = spaceX; x < (spaceX + BOARDWIDTH); x += TILESIZE) { 
      if (darkTile) { 
       g.setColor(dark); 
      } else { 
       g.setColor(bright); 
      } 
      g.fillRect(x, y, TILESIZE, TILESIZE); 
      darkTile = !darkTile; 
     } 
     darkTile = !darkTile; 
    } 
    BufferedImage overlay; 
    try { 
     overlay = ImageIO.read(new File("overlay.png")); 
     JLabel label = new JLabel(new ImageIcon(overlay)); 
     g.drawImage(overlay, spaceX, spaceY, BOARDWIDTH, BOARDHEIGHT, null); 
    } catch (IOException e) {} 
} 

這個我想保存爲一個BufferedImage,所以我不必一直運行這個方法。

那麼,怎樣才能保存我的JPanel的只是這一部分,如果沒有東西棋盤之外? (將會有更多噴漆)

+0

你想「保存」什麼?棋盤? – user3437460

+0

是的,我想保存棋盤。遊戲正在運行一個線程,所以我想盡可能少地計算。 – Duke

+0

[寫作/保存圖像](https://docs.oracle.com/javase/tutorial/2d/images/saveimage.html) – MadProgrammer

回答

2

這個我想保存爲一個BufferedImage,

不知道你需要使用BufferedImage保存到一個文件。您可以在應用程序啓動時創建BufferedImage以供應用程序使用。如果任何用戶顏色改變,您可以重新創建BufferedImage。

您可以直接畫到一個BufferedImage:

BufferedImage image = new BufferedImage(boardSize, boardSize, BufferedImage.TYPE_INT_RGB); 
Graphics2D g2d = image.createGraphics(); 

// draw the squares onto board 

g2d.dispose(); 

現在你createBoard()方法可能應該返回BufferedImage的,因此它可以通過你的應用程序中使用。

+0

這將是偉大的,但我沒有得到它的工作。我嘗試了現在使用2個圖形,一個用於電路板,另一個用於其他電路板,但當涉及到電路板圖形時,會出現NullPointerException。正如我所說的,我很少有經驗,所以你有什麼想法,有什麼可能是錯的?如果你願意,我可以告訴你整個代碼。有沒有可能上傳文件? – Duke

+0

@Duke,「我可以告訴你整個代碼」 - 我們對你的整個代碼不感興趣。我們希望看到一個能夠證明問題的[mcve]。所以在你的情況下,你正在學習如何繪製一個BufferedImage的概念。所以爲了測試這個概念,你需要的是上面的語句加上'g2d.fillRect(10,10,50,50)'。然後你可以使用圖像創建一個'ImageIcon'。然後,您可以創建一個'JLabel'並將標籤添加到框架。那麼整個代碼將大約有15-20行代碼。一旦你學習了基本概念,那麼你就可以將知識應用於真正的問題。 – camickr

0

你把某些努力,把你的問題,所以讓我們有幸與一些想法,讓你去。

首先:你有一個空的catch塊{}。這是不好的做法。這只是吃掉你得到的任何錯誤信息。這沒有幫助。要麼讓這個異常冒泡並停止你的應用程序;或至少打印其內容 - 以便了解發生的情況。

並給予您的評論:您從未現在是否會有誤差。特別是在做IO時,各種事情都可能出錯。請相信我:抓塊是不好練習;你不應該訓練自己去接受他們。

第二個念頭:不要那麼做。儘可能方便,但保存背景圖片在這一點上並沒有增加太多價值。

你不需要擔心這個代碼;它會在您的應用程序啓動時執行一次。

所以,真正的答案在這裏:專注於你想要實現的功能;並且不要被pre-mature optimizations分散注意力。

+0

謝謝你的提示。你是對的,這樣做不是必須的,但我必須畫出疊加圖像,爲什麼不先把整個棋盤保存爲一個圖像,然後畫出這個圖像,而不是讓線程一直計算棋盤?空的catch塊在那裏,因爲我必須使用try catch來避免錯誤,但是永遠不會是一個。那麼有沒有更好的可能性,然後嘗試抓住? – Duke

+0

好的...有道理。只是想知道:你允許調整董事會的大小嗎?如果是這樣,那麼會發生什麼?順便說一句:你的英語非常好。 – GhostCat

+0

也許我會的。所有大小整數在開始遊戲時計算(TILESIZE,spaceY,BOARDHEIGHT ...)所以實際上我認爲這是可能的。 – Duke