2014-04-02 2 views
0

저는이 코드를 작업하려고했습니다. 시작 버튼 위로 마우스를 가져 가면 색상이 회색으로 변경되지만, 마우스를 가리킬 때마다처럼 들립니다. 아무 일도 일어나지 않는데 왜 누군가 말해 줄 수 있니? 나는 어떤 에러도 내지 않았고 내 mousemoved 리스너가 컴파일러에 의해 인식되지 않는 것 같았다. 나의 영어에 대해 유감스럽게 생각한다. 나는 아직 완료하지 않은 있지만, 여기에 코드입니다 :mouseMoved 이벤트가 작동하지 않습니다.

class Contents extends JFrame implements Runnable { 
    private Image dbi; 
    private Graphics dbg; 
    private boolean isStarted, isHovered; 
    private int x,y,xDir,yDir,bx,by,timer,life,my,mx,mhx,mhy; 
    private Rectangle startgame = new Rectangle(80,100,150,40); 
    Contents() 
    { 
    super(); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    if(isStarted) 
    setSize(600,600); 
    else 
    {  
    setSize(300,300); 
    setBackground(Color.BLUE); 
    } 
    setLocationRelativeTo(null); 
    isStarted = false; 
    isHovered = false; 
    addMouseListener(new MouseAdapter() 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      mx = e.getX(); 
      my = e.getY(); 
      if(mx > startgame.x && mx < startgame.x+startgame.width && 
       my > startgame.y && my < startgame.y+startgame.height) 
      { 
       isStarted = true; 
      } 
     } 
     public void mouseMoved(MouseEvent e) 
     { 
      mhx = e.getX(); 
      mhy = e.getY(); 
      if(mhx > startgame.x && mhx < startgame.x+startgame.width && 
       mhy > startgame.y && mhy < startgame.y+startgame.height) 
       isHovered = true; 
      else 
       isHovered = false; 

     } 
    }); 
    } 

    public void paint(Graphics g) 
    { 
     dbi = createImage(getWidth(), getHeight()); 
     dbg = dbi.getGraphics(); 
     draw(dbg); 
     g.drawImage(dbi,0,0,this); 
     repaint(); 
    } 
    public void draw(Graphics g) 
    { 
     if(!isStarted) 
     { 
       if(!isHovered) 
       g.setColor(Color.GRAY); 
       else 
       g.setColor(Color.GREEN); 
        g.fillRect(startgame.x, startgame.y, startgame.width, startgame.height); 
        g.setFont(new Font("Serif",Font.BOLD,24)); 
        g.setColor(Color.WHITE); 
        g.drawString("Start game", startgame.x+20, startgame.y+25); 
        g.drawString(String.format("hoverx: %d hovery: %d",mhx,mhy), 50,200); 
     } 
     else 
     { 
     } 
    } 
    public void run() 
    { 
    } } 

public class Game { 
    public static void main(String[] args) 
    { 
     Contents c = new Contents(); 
    } } 
+0

또한, 일부 게임을 만드는 방법을 배우는 데 도움이되는 사이트를 추천 해 주시겠습니까? 고맙습니다. :) – user3489301

+1

음 ... 버튼에'MouseListener'를 추가하지 말고 프레임이 아닌가요? 그러면'mouseEntered'와'mouseExited'를 사용 하시겠습니까? –

+0

페인팅중인 사용자 정의 버튼 인 경우, 모양이 비슷합니다. 1. mouseMoved 메소드에서'repaint()'를 호출해야합니다. 2.'paint' 메소드에서'repaint'를 호출하지 마십시오. . 또한'paint' 메소드에서'super.paint'를 호출하는 것을 잊고 있습니다. –

답변

2

그냥 MouseEvent의 포인트가 Rectangle 안에 있는지 확인하는 Rectangle.contains(Point)을 사용. 여기에 예제가 있습니다

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.geom.Rectangle2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class PaintedButton extends JPanel { 
    private static final Color HOVER_COLOR = Color.BLUE; 
    private static final Color NON_HOVER_COLOR = Color.GREEN; 
    private static final Rectangle2D RECTANGLE = new Rectangle2D.Double(50, 50, 
      200, 100); 

    private Color color = NON_HOVER_COLOR; 

    public PaintedButton() { 
     addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseMoved(MouseEvent e) { 
       Point p = e.getPoint(); 
       if (RECTANGLE.contains(p)) { 
        color = HOVER_COLOR; 
       } else { 
        color = NON_HOVER_COLOR; 
       } 
       repaint(); 
      } 
     }); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setPaint(color); 
     g2.fill(RECTANGLE); 

    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 200); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new PaintedButton()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

감사합니다.이 코드를 참조로 사용합니다. :) – user3489301

관련 문제