我创建了这个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) {
}
}
答案 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();
}
}