2011-11-21 45 views
0

我工作的一个游戏和菜单我使用Canvas ES绘制该菜单的东西。帆布串点击检测

对于我使用图形在画布上选项和按钮来绘制一个字符串。如何检测鼠标点击字符串?

选项帆布:

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JFrame; 

public class OptionsScreen extends Canvas{ 

private static final long serialVersionUID = 1L; 
private Mouse ms = new Mouse(); 
private int optionPos = 275; 
private int volLev = 100; 
private int screenX = 800; 
private int screenY = 600; 
private JFrame mainWindow; 

public OptionsScreen(JFrame f) 
{ 
    mainWindow = f; 
} 

public void paint(Graphics g) { 
    g.setFont(new Font("JI-Pelter", Font.PLAIN, 24)); 
    g.setColor(Color.lightGray); 

    //Draw strings 
    //Music and Sound 
    g.drawString("Music:", optionPos, 150); g.setColor(Color.yellow); g.drawString("On", optionPos + 100, 150); g.setColor(Color.white); g.drawString("Off", optionPos + 175, 150); g.setColor(Color.lightGray); 
    g.drawString("Sound:", optionPos, 200); g.setColor(Color.yellow); g.drawString("On", optionPos + 100, 200); g.setColor(Color.white); g.drawString("Off", optionPos + 175, 200); g.setColor(Color.lightGray); 
    g.drawString("Volume Level:", optionPos, 250); g.setColor(Color.white); g.drawString(volLev + "%", optionPos + 175, 250); g.setColor(Color.lightGray); 
    //OpenGL Settings 
    g.drawString("Advanced OpenGL:", optionPos, 300); g.setColor(Color.white); g.drawString("On", optionPos + 225, 300); g.setColor(Color.yellow); g.drawString("Off", optionPos + 300, 300); g.setColor(Color.lightGray); 
    //Screen Settings 
    g.drawString("Game Resolution:", optionPos, 350); g.setColor(Color.white); g.drawString(screenX + "x" + screenY, optionPos + 200, 350); g.setColor(Color.lightGray); 
    this.addMouseListener(ms); 
} 
} 

class Mouse implements MouseListener 
{ 
@Override 
public void mouseClicked(MouseEvent arg0) { 
} 

@Override 
public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void mousePressed(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void mouseReleased(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 
} 
+1

不要混合Swing组件(例如'JFrame')与AWT的部件(例如'Canvas')。 *“(代码更新)” *(答案后) –

+0

paint方法是画,没有别的。反过来说:听众注册必须在其他地方完成(一次) – kleopatra

+0

为什么重新发明轮子?有组件可以处理所有这些细节(按钮f.i.) – kleopatra

回答

3

只需使用该字符串的JLabel。然后,您可以将MouseListener添加到标签。

+0

如果使用一个可能的OP,这绝对是更简单的方法 –

0

你可以简单的矩形区域分配给一个给定的菜单项,如果在某一地区发生了点击,那么你知道它的相应的菜单项已被点击。

2

可以使用getStringBounds方法FontMetrics让您的字符串的界限,并确定是否被点击了该矩形。

安德鲁Thomspon提到的,你应该避免混合摆动(轻量级)和AWT(重量级)如果可以的话(不过,如果需要http://java.sun.com/developer/technicalArticles/GUI/mixing_components/你可以做到这一点)组件。

+0

我投票支持你的。 getStringBounds()是一个更好的建议。 – Bill

+0

我会尝试这个谢谢,我会投票,如果它的工作 –

+1

好吧,我有一个'FontMetrics'并将它设置为图形,我该如何使用它? –