需要在java中帮助定位

时间:2016-11-25 06:16:15

标签: java swing graphics jframe position

我创建了这个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) {

}
  }

1 个答案:

答案 0 :(得分:3)

好的,上面包含的代码存在一些问题。

第一个让我感到高兴的是你将鼠标动作监听器添加到框架的方式。这有很多问题。

首先,您在paintComponent方法中执行此操作,如果它有效,仍然被认为是不好的做法,因为可能会多次调用paintComponent方法。正如评论所指出的那样,在专家组的构造函数中这样做。

第二个是你要将鼠标监听器添加到框架而不是面板,因为面板位于"以上"框架,因此只能在面板中识别鼠标事件。这里最好的办法是将MouseMotionListener直接添加到面板本身。

第三个是你在MouseMotionListener类中实现GameSetup接口,但实际上从未对这个实现做任何事情。所以我所做的就是我摆脱了内部类,只是将面板作为自己的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();
    }

}