2012-05-13 2 views
1

Я пытаюсь получить положение мыши и загорать кнопку, когда курсор над ней. Однако положение мыши не корректируется правильно. Я думаю, что позиция y испорчена, потому что в настоящее время, если я намного выше кнопки, она загорается.Ошибка мыши не исправлена ​​

Heres мой код, который неверен:

public void mouseMoved(MouseEvent e) { 
    Window.mse = new Point((e.getX()) + ((Frame.size.width - Window.myWidth)/2), (e.getY()) + (Frame.size.height - (Window.myHeight)/2)); 
} 

Это файл из окна:

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 

public class Window extends JPanel implements Runnable { 

    public Thread thread = new Thread(this); 

    public static Image[] tileset_ground = new Image[100]; 
    public static Image[] tileset_air = new Image[100]; 
    public static Image[] tileset_resources = new Image[100]; 

    public static int myWidth, myHeight; 

    public static boolean isFirst = true; 

    public static Point mse = new Point(0, 0); 

    public static Room room; 
    public static Levels levels; 
    public static Shop shop; 

    public Window(Frame frame) { 
     frame.addMouseListener(new KeyHandler()); 
     frame.addMouseMotionListener(new KeyHandler()); 

     thread.start(); 
    } 

    public void define() { 
     room = new Room(); 
     levels = new Levels(); 
     shop = new Shop(); 

     tileset_resources[0] = new ImageIcon("resources/cell.png").getImage(); 

     levels.loadLevels(new File("levels/level1.level")); 

     for(int i=0;i<tileset_ground.length; i++) { 
      tileset_ground[i] = new ImageIcon("resources/tileset_ground.png").getImage(); 
      tileset_ground[i] = createImage(new FilteredImageSource(tileset_ground[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32))); 
     } 

     for(int i=0;i<tileset_air.length; i++) { 
      tileset_air[i] = new ImageIcon("resources/tileset_air.png").getImage(); 
      tileset_air[i] = createImage(new FilteredImageSource(tileset_air[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32))); 
     } 

    } 

    public void paintComponent(Graphics g) { 
     if(isFirst) { 

      myWidth = getWidth(); 
      myHeight = getHeight(); 

      define(); 

      isFirst = false; 
     } 

     g.setColor(new Color(70, 70, 70)); 
     g.fillRect(0, 0, myWidth, myHeight); 
     g.setColor(new Color(0, 0, 0)); 
     g.drawLine(room.block[0][0].x, room.block[room.worldHeight - 1][0].y + room.blockSize, room.block[0][room.worldWidth - 1].x + room.blockSize, room.block[room.worldHeight - 1][0].y + room.blockSize); 
     g.drawLine(room.block[0][0].x, room.block[room.worldHeight - 1][0].y + 1 + room.blockSize, room.block[0][room.worldWidth - 1].x + room.blockSize, room.block[room.worldHeight - 1][0].y + 1 + room.blockSize); 


     room.draw(g); //Draws room 
     shop.draw(g); //Draws shop 
    } 

    public void run() { 
     while(true) { 

      if(!isFirst) { 
       room.physic(); 
      } 

      repaint(); 

      try { 
       Thread.sleep(1); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 

     } 

    } 

} 
+0

Почему бы просто не добавить MouseListener в JButton? Или еще лучше, добавьте ChangeListener в модель JButton. –

+0

Мне нужно будет использовать положение мыши еще несколько раз, поэтому я пытаюсь использовать его вместо переменной. А затем, когда кнопка содержит переменную (mse), она загорается. – core16

+0

Ничего, я решил это, удалив (/ 2) в конце. – core16

ответ

1

Просто добавьте MouseListener к JButton. Или еще лучше добавьте ChangeListener к модели кнопки, и в нем вызовите isRollover() на модель.

+0

Мне нужно будет использовать положение мыши еще несколько раз, поэтому я пытаюсь использовать его вместо переменной. А затем, когда кнопка содержит переменную (mse), она загорается. – core16

+0

Nevermind я решил это, удалив (/ 2) в конце – core16

+0

, но спасибо за альтернативный способ сделать это – core16

Смежные вопросы