2013-06-06 3 views
0

Я хочу добавить функцию, чтобы при перемещении мыши по кнопке она добавила тень. В настоящее время я просто пытаюсь заставить механику работать. У меня есть игровой цикл вызова метода обновления, который я знаю, работает, но здесь это все равноJava-графика не перекрашивается

public void updateManager(double delta){ 
    mhandler.updateCoordinates(); 
    if(mhandler.getX() >= 144 && mhandler.getX() <= 444 && mhandler.getY() >= 784 && mhandler.getY() <= 980){ 
     oversp = true; 
    }else{ 
     oversp = false; 
    } 
} 

mhandler является то, что я назвал свой MouseHandler класса. тогда у меня есть мой метод визуализации

public void render(){ 
    repaint(); 
} 

, а затем мой метод рисования

public void paintComponent(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 

    if(oversp){ 
     System.out.println("Is over button"); 
     g2d.setColor(Color.RED); 
     g2d.fillRect(144, 784, 300, 169); 
    }else{ 
     System.out.println("Not over button"); 
     g2d.setColor(Color.BLACK); 
     g2d.fillRect(144, 784, 300, 169); 
    } 
} 

Если когда-нибудь я запустить программу, она только печатает не более кнопки в два раза, даже если я буду постоянно призывая оказывать() в мой игровой цикл. Я действительно не знаю, почему это не перекрашивает. любая помощь очень приветствуется!

Это, как я могу определить свои координаты мыши

private int x,y; 

public MouseHandler(){ 
    x = 0; 
    y = 0; 
} 

public void updateCoordinates(){ 
    PointerInfo a = MouseInfo.getPointerInfo(); 
    Point b = a.getLocation(); 
    x = (int) b.getX(); 
    y = (int) b.getY(); 
} 

public int getX(){ 
    return x; 
} 

public int getY(){ 
    return y; 
} 

код цикла игры

public static void MenuLoop() { 
    long lastLoopTime = System.nanoTime(); 
    final int TARGET_FPS = 60; 
    final long OPTIMAL_TIME = 1000000000/TARGET_FPS; 
    long lastFpsTime = 0; 
    int fps = 0; 
    while (isrunning) { 
     long now = System.nanoTime(); 
     long updateLength = now - lastLoopTime; 
     lastLoopTime = now; 
     double delta = updateLength/((double) OPTIMAL_TIME); 

     lastFpsTime += updateLength; 
     fps++; 

     if (lastFpsTime >= 1000000000) { 
      System.out.println("(FPS: " + fps + ")"); 
      lastFpsTime = 0; 
      fps = 0; 
     } 

     menu.render(); 
     menu.updateManager(delta); 


     try { 
      Thread.sleep((lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000); 
     } catch (Exception e) { 

     } 
    } 

}public static void MenuLoop() { 
    long lastLoopTime = System.nanoTime(); 
    final int TARGET_FPS = 60; 
    final long OPTIMAL_TIME = 1000000000/TARGET_FPS; 
    long lastFpsTime = 0; 
    int fps = 0; 
    while (isrunning) { 
     long now = System.nanoTime(); 
     long updateLength = now - lastLoopTime; 
     lastLoopTime = now; 
     double delta = updateLength/((double) OPTIMAL_TIME); 

     lastFpsTime += updateLength; 
     fps++; 

     if (lastFpsTime >= 1000000000) { 
      System.out.println("(FPS: " + fps + ")"); 
      lastFpsTime = 0; 
      fps = 0; 
     } 

     menu.render(); 
     menu.updateManager(delta); 


     try { 
      Thread.sleep((lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000); 
     } catch (Exception e) { 

     } 
    } 

} 
+1

Может быть, ваш игровой цикл блокирует поток gui? –

+0

Должна быть проблема с тем, как вы обнаруживаете, находится ли мышь внутри или снаружи кнопки, но поскольку у нас нет кода для этого, на данный момент невозможно устранить неполадки. Кроме того, было бы гораздо лучше сравнить вашу позицию мыши с координатами, возвращаемыми самой кнопкой, вместо использования абсолютных значений для X и Y. – CodeBlind

+0

теперь я добавил код – tyty5949

ответ

2

Event Dispatch Thread содержит очередь, к которой добавляются все AWT события. Всякий раз, когда вы вызываете repaint, событие рисования будет помещено в очередь на тему Dispatch Event.

Так что, если вы находитесь в бесконечном цикле во время потока событий, те события рисования будут стоять в очереди навсегда, ожидая окончания бесконечного цикла. Вот почему paintComponent никогда не вызывается.

Решение состоит в том, чтобы заменить бесконечный цикл на Swing timer.

Timer timer = new Timer(1000/TARGET_FPS, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     //... 
    } 
}); 
timer.start();