需要帮助定位 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
方法可能会被调用多次。正如评论所指出的那样,在面板的构造函数中执行此操作。
第二个是你将鼠标侦听器添加到框架,而不是面板,这不起作用,因为面板是 "above" 框架,所以鼠标事件只会在控制板。最好的办法是将 MouseMotionListener 直接添加到面板本身。
第三个是您在 GameSetup
class 中实现了 MouseMotionListener
接口,但实际上从未对这个实现做任何事情。所以我所做的就是摆脱了内部 class,让面板成为它自己的 MouseMotionListnener
代码的第二个错误是 paintComponent
方法仅在某些时间点被调用(参见 this)。这意味着即使鼠标可能已在区域内移动,也不会调用您的 paintComponent 方法来相应地更新屏幕。为此,您需要为面板调用 repaint
方法。
第三个是你没有给你的panel设置size,默认是0x0,所以你需要给你的panel设置一个size(应该和frame本身一样)(如果你想保留默认布局)。
综上所述,这是我修复的您的代码。我添加了一个名为 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();
}
}
我创建了这个 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
方法可能会被调用多次。正如评论所指出的那样,在面板的构造函数中执行此操作。
第二个是你将鼠标侦听器添加到框架,而不是面板,这不起作用,因为面板是 "above" 框架,所以鼠标事件只会在控制板。最好的办法是将 MouseMotionListener 直接添加到面板本身。
第三个是您在 GameSetup
class 中实现了 MouseMotionListener
接口,但实际上从未对这个实现做任何事情。所以我所做的就是摆脱了内部 class,让面板成为它自己的 MouseMotionListnener
代码的第二个错误是 paintComponent
方法仅在某些时间点被调用(参见 this)。这意味着即使鼠标可能已在区域内移动,也不会调用您的 paintComponent 方法来相应地更新屏幕。为此,您需要为面板调用 repaint
方法。
第三个是你没有给你的panel设置size,默认是0x0,所以你需要给你的panel设置一个size(应该和frame本身一样)(如果你想保留默认布局)。
综上所述,这是我修复的您的代码。我添加了一个名为 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();
}
}