2012-03-15 72 views
2

我編碼在Java中,棋盤遊戲風險在學校的一個項目的按鈕形狀。我需要讓每個地區成爲一個單獨的按鈕。我將每個區域分成具有透明背景的不同圖片。我明白2D java按鈕是面向矩形的,所以我可能不得不使用alpha值,因爲我爲每個領域的背景賦予了透明背景。編碼風險(遊戲):製作土

如果我這樣做,有兩個問題成爲當前:

  1. 如果按下按鈕的透明區域,我不知道。
  2. 的按鈕,因爲他們天生矩形形狀的重疊,並且我只需要其中包含被點擊要啓動的是,非透明像素的按鈕。

或者是有完全接近編碼遊戲更有效的方法? 歡迎任何幫助,因爲它非常需要。 我在網上找到了一個java版的棋盤遊戲,但我無法理解它。 (它的標記統治,但實際上是風險。 Link to the map || The link to the game I found online

+0

這可能有所幫助:http://stackoverflow.com/questions/6735891/creating-custom-jbutton-from-images-cont aining-transparent-pixels – 2012-03-15 19:10:45

回答

3

這是我做的,你可以繼續使用感官運動只有在沒有區域透明度。

IMAGEBUTTON.java除非你給它一個ImageIcon和它的意義阿爾法提供類

使用setMinimumDetectionAlpha()的情況下,如果你有你的任何影子來爲png作品就像一個JButton的。

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.BufferedImage; 
import javax.swing.ImageIcon; 

@SuppressWarnings("serial") 
public class ImageButton extends javax.swing.JButton implements MouseListener{ 

private MouseListener mouseListener = null; 
private BufferedImage bufferedImage; 
private int minAlpha = 0x0; 
private boolean userMouseListener = false; 

public ImageButton(ImageIcon ic){ 
    super(); 
    setPreferredSize(new Dimension(ic.getIconWidth(), ic.getIconHeight())); 
    setImage(ic); 
    addMouseListener(this); 
} 
protected BufferedImage imageIconToBufferedImage(ImageIcon a){ 
    BufferedImage bi = new BufferedImage(a.getIconWidth(), a.getIconHeight(), BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2d = (Graphics2D) bi.getGraphics(); 
    g2d.drawImage(a.getImage(), 0,0,null); 
    g2d.dispose(); 
    return bi; 
} 
public void setImage(ImageIcon ic){ 
    bufferedImage = imageIconToBufferedImage(ic); 
    repaint(); 
} 
protected void paintComponent(Graphics g){ 
    Graphics2D g2d = (Graphics2D) g; 
    RenderingHints _rh = g2d.getRenderingHints(); 
    g2d.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.drawImage(bufferedImage, 0, 0, null); 
    g2d.setRenderingHints(_rh); 
} 
protected void setMinimumDetectionAlpha(int alpha){ 
    minAlpha = alpha == 0 ? 1 : alpha; 
    minAlpha = minAlpha % 0x000000FF << 0x00000010; 
} 
protected void processMouseEvent(MouseEvent e) { 
    if(checkInBounds(e.getX(), e.getY())){ 
     switch(e.getID()){ 
      case MouseEvent.MOUSE_CLICKED: mouseListener.mouseClicked(e);  break; 
      case MouseEvent.MOUSE_ENTERED: mouseListener.mouseEntered(e);  break; 
      case MouseEvent.MOUSE_EXITED: mouseListener.mouseExited(e);  break; 
      case MouseEvent.MOUSE_PRESSED: mouseListener.mousePressed(e);  break; 
      case MouseEvent.MOUSE_RELEASED: mouseListener.mouseReleased(e);  break; 
     }   
     e.consume();    
    } 
} 
public void addMouseListener(MouseListener a){ 
    if(!userMouseListener) 
     super.addMouseListener(a); 
    else 
     mouseListener = a; 
    userMouseListener = true;  
} 
protected boolean checkInBounds(int x, int y){ 
    try{   
     if((bufferedImage.getRGB(x, y) & 0xFF000000)>>>4 >= (minAlpha > 0 ? minAlpha : 0x08800000)) 
      return true; 
     else 
      throw new Exception(); 
    }catch(Exception e){ 
     return false; 
    } 
} 
@Override 
public void mouseClicked(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mouseEntered(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mouseExited(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mousePressed(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mouseReleased(MouseEvent e) {  processMouseEvent(e); } 
} 

你可以繼續使用它像這樣

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 


public class Test { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    JFrame jmb = new JFrame(); 
    ImageButton ib = new ImageButton(new ImageIcon("res/buttonImage.png")); 
    ib.setMinimumDetectionAlpha(0); 
    ib.addMouseListener(new MouseListener(){ 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

    }); 
    jmb.add(ib); 
    jmb.pack(); 
    jmb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jmb.show(); 
} 

} 

圖像所用的是這樣的事情

buttonImage.png

我希望這可以幫助你:d

+1

一個不錯的答案+1 – mKorbel 2012-03-16 08:03:38

3

你能避免使用多個按鈕,只是一個自定義繪製的面板上添加一個MouseListener

我猶豫的是,我甚至懷疑使用透明按鈕時,你會得到你想要的行爲,當他們重疊。可能會發現一些花哨的point-in-polygon算法處理點擊時有幫助

+1

['Polygon'](http://docs.oracle.com/javase/7/docs/api/java/awt/Polygon.html)有一個合適的'contains()'實現。 – trashgod 2012-03-15 22:07:46

+0

Rob,如何製作自定義面板?如果我聽起來很愚蠢,我很抱歉,但我對此很陌生。感謝您的幫助。 – user1272300 2012-03-16 06:04:08

+0

創建一個擴展'JPanel'的新類,併爲'paintComponent(Graphics)'方法添加一個覆蓋。 – 2012-03-16 13:52:28