簡體   English   中英

需要在java中幫助定位

[英]Need help positioning in java

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

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) {

}
  }

好的,上面包含的代碼有幾個問題。

第一個讓我感到高興的是你將鼠標動作監聽器添加到框架的方式。 這有很多問題。

首先,你在paintComponent方法中這樣做,如果它起作用,它仍被認為是不好的做法,因為paintComponent方法可能被多次調用。 正如評論所指出的那樣,在專家組的構造函數中這樣做。

第二個是你將鼠標監聽器添加到框架而不是面板,因為面板位於框架的“上方”,所以它不起作用,因此只能在面板中識別鼠標事件。 這里最好的選擇是將MouseMotionListener直接添加到面板本身。

第三個是你在GameSetup類中實現MouseMotionListener接口,但實際上從未對這個實現做任何事情。 所以我做的是我擺脫了內部類,並且讓面板成為它自己的MouseMotionListnener

代碼的第二個問題是paintComponent方法僅在某些時間點被調用(參見此內容 )。 這意味着即使鼠標可能已在區域內移動,也不會調用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();
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM