2017-08-01 79 views
2

我正在使用Swing開發一個Fire Emblem模擬器(我剛開始使用Swing,之前我主要在控制檯程序上工作)。對於那些不熟悉遊戲的人來說,這是一個基於瓦片的戰略遊戲,你可以在網格上移動單位(類似於國際象棋)。爲JButton定義背景顏色和前景圖標?

Example

我在考慮使用Jbutton將網格,讓玩家能夠點擊他想要移動,點擊他的目的地的單元上。正如你在圖片上看到的,單位後面的瓷磚顏色可能會有所不同(紅色表示單位可以攻擊該瓷磚上的單位,藍色表示所選單位可以移動的瓷磚)。我不希望每個單元有15種不同的瓷磚設計(UnitX具有藍色背景,UnitX具有紅色背景,UnitX具有綠色背景等等),所以有沒有辦法在JButton中使用「圖層」?畫一個藍色的瓷磚,並在其上繪製正確的字符?

+0

這可能是你正在試圖做 https://stackoverflow.com/questions/2407024/drawing-graphics-on-top-of什麼有用-j-jbutton – Matt

回答

0

camickr得到的答案是正確的(假設我已經理解了你的問題)。

以下代碼演示瞭如何在JButton上使用setBackgroundsetIcon。它顯示了一個帶有背景顏色和圖標的按鈕。該鍵可以改變被點擊時,其背景色:

import javax.swing.*; 
import java.awt.*; 
import java.net.*; 
import java.util.*; 
import java.util.List; 

public class ButtonBackgroundAndIcon { 
    private static final List<Color> BACKGROUND_COLORS = Arrays.asList(
      new Color(229, 119, 120), 
      Color.BLUE, 
      Color.CYAN, 
      Color.GREEN, 
      Color.YELLOW, 
      Color.RED 
    ); 

    private int backgroundIndex; 

    public static void main(String[] arguments) { 
     SwingUtilities.invokeLater(new ButtonBackgroundAndIcon()::run); 
    } 

    private void run() { 
     JFrame frame = new JFrame("Stack Overflow"); 
     frame.setBounds(100, 100, 800, 600); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     JButton tileButton = new JButton(); 
     tileButton.setBackground(BACKGROUND_COLORS.get(0)); 

     Icon icon = getRoyIcon(); 
     if (icon != null) { 
      tileButton.setIcon(icon); 
     } 

     tileButton.addActionListener(actionEvent -> { 
      backgroundIndex = (backgroundIndex + 1) % BACKGROUND_COLORS.size(); 
      tileButton.setBackground(BACKGROUND_COLORS.get(backgroundIndex)); 
     }); 

     frame.getContentPane().add(tileButton); 

     frame.setVisible(true); 
    } 

    private ImageIcon getRoyIcon() { 
     ImageIcon imageIcon; 

     try { 
      String iconLocation = "http://orig06.deviantart.net/fd0e/f/2008" 
            + "/060/d/1/roy_sprite_by_chstuba007.gif"; 
      imageIcon = new ImageIcon(new URL(iconLocation)); 
     } catch (MalformedURLException e) { 
      imageIcon = null; 
     } 

     return imageIcon; 
    } 
} 
+0

(1-)正如你所說的答案已經給出。無需重複答案。無需編寫代碼。所有OP所要做的就是將兩行代碼添加到他們當前的程序中來測試解決方案。 – camickr

3

畫一個藍色的瓷磚,並在其上繪製正確的字符?

  1. 使用setBackground(...)方法來設置背景顏色 。

  2. 使用setIcon(...)方法來設置字符。