2017-10-10 13 views
-2

그래서 나는 이상한 소리가 들릴 때 이미지를 바꾸는이 것을 설정하려고합니다. 마우스가 내 이미지 위에 있는지를 알기 위해 이미 mouseListener를 설정했습니다. 나는 이미지 위치가 저장되어있는 변수를 가지고 있으며, 이미지가 덮혀있을 때 바뀐다. 내 페인트 명령을 실행하면 기본 이미지가 페인트되고 그 위에 마우스를 가져 가면 다시 페인트되지 않기 때문에 변경되지 않습니다. 어떻게하면 이미지 위치가 변경 될 때 다시 페인트 할 수 있도록 만들 수 있습니까? BTW mouseListener가 이미지와 다른 클래스에 있습니다.내 페인트 기능에서 무언가를 반복하는 방법은 무엇입니까?

내 이미지 :

private String settingsConfig = snake.settingsConfig; 
settingsImage = new ImageIcon(getClass().getResource(settingsConfig)); 
settingsImage.paintIcon(this, g, 700, 23); 

내 주요 클래스 (다른 클래스에서) 페인트 (그래픽 g)의

public class snake implements MouseListener{ 

public static int mouseX; 
public static int mouseY; 

public static String settingsConfig = "/assets/settings.png"; 

public static void main(String[] args) { 

    // JFrame 
    JFrame obj = new JFrame("Snake"); 
    gameplay Gameplay = new gameplay(); 
    obj.setBounds(10, 10, 905, 700); 
    obj.setBackground(Color.DARK_GRAY); 
    obj.setResizable(false); 
    obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    obj.add(Gameplay); 
    obj.setVisible(true); 

    obj.addMouseMotionListener(new MouseAdapter() { 
     @Override 
     public void mouseMoved(MouseEvent e) { 
      mouseX = e.getX(); 
      mouseY = e.getY(); 
      if(mouseX > 699 && mouseX < 761 && mouseY > 22 + 25 && mouseY < 54 + 25) { 
       settingsConfig = "/assets/settingshover.png"; 
      } 
      else { 
       settingsConfig = "/assets/settings.png"; 
      } 
     } 
    }); 
} 

아주 작은 조각 (그림 방법은 다른 클래스에) :

public void paint (Graphics g) { 

    if(moves == 0) { 
     snakexlength[2] = 50; 
     snakexlength[1] = 75; 
     snakexlength[0] = 100; 

     snakeylength[2] = 100; 
     snakeylength[1] = 100; 
     snakeylength[0] = 100; 
    } 

    if(moves >= 1) { 
     playing = true; 
    } 

    // Draw title image border 
    g.setColor(Color.WHITE); 
    g.drawRect(24, 10, 851, 55); 

    // Draw the title image and settings 
    titleImage = new ImageIcon(getClass().getResource("/assets/snaketitle.jpg")); 
    titleImage.paintIcon(this, g, 25, 11); 

    settingsImage = new ImageIcon(getClass().getResource(settingsConfig)); 
    settingsImage.paintIcon(this, g, 700, 23); 

    // Draw the border for gameplay 
    g.setColor(Color.WHITE); 
    g.drawRect(24, 74, 851, 577); 

    // Draw background for the gameplay 
    g.setColor(Color.BLACK); 
    g.fillRect(25, 75, 850, 575); 

    // Draw score 
    g.setColor(Color.WHITE); 
    g.setFont(new Font("arial", Font.PLAIN, 14)); 
    g.drawString("Score: " + score, 780, 30); 

    // Draw high score 
    g.drawString("High Score: " + highScore, 780, 50); 
} 
+0

이미이 질문을했으며 중복 된 질문과 여러 가지 유사한 질문에 대한 링크가 제공되었습니다. 왜 다시 묻는거야? 이전 링크에서 얻은 것을 왜 보여주지 않습니까? 이전에 요청한대로 [mcve]를 게시하지 않는 이유는 무엇입니까? –

+0

이것은 다르지만, 내 페인트 기능에서 무언가를 반복 할 수있는 방법에 대해 묻고 있습니다. –

+0

루프를 수행하지 않고 논리를 올바르게 생각하지 않아도됩니다. 중복 된 내용을 읽으십시오. 마우스 수신기의 필드 상태를 변경 한 다음 해당 변경을 사용하여 페인트 할 대상을 결정합니다. 그러나 이전에 제안되었던 것처럼 JLabels에서 ImageIcon을 교환하는 것이 훨씬 낫습니다. –

답변

0

어떻게 다시 그리 나 할 수 있습니까? 이미지 위치가 변경된 시점에

그림을 업데이트해야하는 장소에 reapint();을 호출하십시오. 예를 들어, 이미지 위에 마우스를 올려 놓을 때 리스너에서.

public void mouseMoved(MouseEvent e) { 
    mouseX = e.getX(); 
    mouseY = e.getY(); 
    if(mouseX > 699 && mouseX < 761 && mouseY > 22 + 25 && mouseY < 54 + 25){ 
     settingsConfig = "/assets/settingshover.png"; 
    } 
    else{ 
     settingsConfig = "/assets/settings.png"; 
    } 
    repaint(); 
} 
+0

고마워요, 문제는 제 페인트 기능이 다른 클래스에 있다는 것입니다 ... –

+0

그게 제가 직면하는 문제입니다 –

+0

@EricLeus 그렇다면 현재 코드 구조를 보여줄 수 있습니다. 패널 및 청취자를 코딩 한 곳 등. – user3437460