2016-11-25 480 views
1

我創建了這個java程序,我想要一個輸出,如果int x和int y大於100,它會繪製一個矩形。但事實並非如此。我怎樣才能使它工作?我需要添加另一行代碼嗎? 這裏是我的代碼:在java中需要幫助定位

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


@SuppressWarnings("serial") 
public class GameSetup extends JPanel implements MouseMotionListener{ 

public static JFrame njf = new JFrame("Test"); 
public static int x, y; 

public static void main(String[] args){ 

    GameSetup gs = new GameSetup(); 
    njf.add(gs); 

} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    this.setBackground(Color.BLACK); 
    g.setColor(Color.GREEN); 
    g.fillRect(150, 75, 200, 100); 
    g.setColor(Color.ORANGE); 
    g.drawString("Play", 239, 123); 
    njf.addMouseListener(new MouseAdapter() { 
     public void mouseMoved(MouseEvent e) { 
      x = e.getX(); 
      y = e.getY(); 

     } 
    }); 
    if(x > 100 && y > 100){ 
     g.drawRect(10, 10, 100, 100); 
    } 
} 

public GameSetup(){ 
    njf.setSize(500,500); 
    njf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    njf.setResizable(false); 
    njf.setLocationRelativeTo(null); 
    njf.setVisible(true); 
} 

@Override 
public void mouseDragged(MouseEvent arg0) { 

} 

@Override 
public void mouseMoved(MouseEvent e) { 

} 
    } 
+0

是paint組件被調用後,位置超過100?如果不只是將if語句移動到mouseMoved方法的內部 –

+0

'public void paintComponent(Graphics g){ .. njf.addMouseListener(new MouseAdapter(){'不,不,不!不要使用paint方法(可能會多次調用)來添加監聽器到組件中,在構造函數中這樣做 –

回答

3

好了,有幾件事情錯了,你上面包含的代碼。

第一個突出給我的是你添加鼠標動作偵聽器到框架的方式。有很多事情是錯誤的。

首先,您在paintComponent方法中執行此操作,如果該方法有效,仍然被認爲是不好的做法,因爲可能會多次調用paintComponent方法。正如評論所指出的那樣,在專家組的構造函數中這樣做。

第二個是您將鼠標偵聽器添加到框架,而不是面板,由於面板位於框架「上方」,因此鼠標事件只能在面板內識別,因此無法工作。這裏最好的選擇是將MouseMotionListener直接添加到面板本身。

第三個是你正在GameSetup類中實現MouseMotionListener接口,但從來沒有對這個實現做任何事情。所以我做的是我擺脫了內部類,只是面板是自己的MouseMotionListnener

代碼錯誤的第二件事是paintComponent方法只在某些時間點被調用(見this)。這意味着即使鼠標可能在區域內移動了,也不會調用paintComponent方法來相應地更新屏幕。爲此,您需要調用面板的repaint方法。

第三個是你沒有爲你的面板設置一個尺寸,默認的是0x0,所以你需要設置面板​​的尺寸(它應該和框架本身一樣)(如果你想要保持默認佈局)。

所有的說法,這裏是你的代碼,我修好了。我添加了一個名爲enteredZone的變量來跟蹤鼠標是否先前已經進入該區域,這樣即使鼠標在進入該區域後仍離開該區域(如果您想保留該區域,您可以選擇它),該矩形將保持不變。請注意,此代碼還有其他一些可能被認爲是不好的做法,但這足以讓您開始:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


@SuppressWarnings("serial") 
public class GameSetup extends JPanel implements MouseMotionListener { 

    public static JFrame njf = new JFrame("Test"); 
    public static int x = 0, y = 0; 
    public static boolean enteredZone = false; 

    public static void main(String[] args) { 
     GameSetup gs = new GameSetup(); 
     gs.addMouseMotionListener(gs); 
     njf.add(gs); 
     njf.setVisible(true); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     this.setBackground(Color.BLACK); 

     g.setColor(Color.GREEN); 
     g.fillRect(150, 75, 200, 100); 
     g.setColor(Color.ORANGE); 
     g.drawString("Play", 239, 123); 


     if (x > 100 && y > 100 || enteredZone){ 
      g.drawRect(10, 10, 100, 100); 
      enteredZone = true; 
     } 
    } 

    public GameSetup() { 
     super(); 
     setSize(500, 500); 
     njf.setSize(500,500); 
     njf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     njf.setResizable(false); 
     njf.setLocationRelativeTo(null); 
    } 

    @Override 
    public void mouseDragged(MouseEvent arg0) { 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     x = e.getX(); 
     y = e.getY(); 

     if (x > 100 && y > 100) repaint(); 
    } 

} 
+1

在添加所有組件之前,你的代碼在JFrame *上調用了'setVisible(true)',這是一個危險的事情 –

+0

否則它看起來不錯 –

+0

謝謝!我只是修好了! –