gpt4 book ai didi

Java - 重新绘制 JPanel 会出现错误

转载 作者:行者123 更新时间:2023-12-02 05:19:23 25 4
gpt4 key购买 nike

我是 Java 初学者,我正在尝试创建一个应用程序,在光标所在的位置绘制一个矩形。我已经完成了所有操作,但无法使用 mouseMoved(MouseEvent) 方法 来重新绘制 JPanel。如果没有重绘,矩形只绘制一次,仅此而已。通过重绘,它编译得很好,但是当我运行它时,每次移动鼠标时,我都会收到这个大的“线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException”错误。

那么,有人可以帮我解决这个问题吗?

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

public class Game extends JPanel implements MouseMotionListener
{
public static void main(String[] args) {
new Game().game();
}
JPanel panel;
JButton button2;
JButton button;
public void game() {
JPanel panel = new Game();
button = new JButton("Ok");
panel.setLayout(new FlowLayout());
panel.add(button);

button2 = new JButton("Cancel");

JFrame frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setResizable(false);
frame.add(panel);

frame.setVisible(true);
panel.addMouseMotionListener(this);
}

public void paintComponent(Graphics g) {

super.paintComponent(g);
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX();
int y = (int) b.getY();
g.fillRect(x,y,100,100);
}

public void mouseMoved(MouseEvent evt) {
panel.repaint; //This is the line of code that I need help with. Thanks!
}
public void mouseDragged(MouseEvent evt) {}
}

最佳答案

希望代码示例中的注释能够告诉您代码中做错了什么:-),否则总有理由提出您的疑问...

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

public class Game extends JPanel {
/*
* Now x and y are instance variables,
* whose values you can change at each
* MouseMove Event, and call repaint()
* to see the effects
*/

private int x;
private int y;
private MouseAdapter mouseActions =
new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent me) {
/*
* Now as the Mouse moves, we simply
* updating the instance variables,
* i.e. x and y to the new values
* of the Mouse Location and calling
* repaint() to draw the rectangle.
* Since this class (Game) extends JPanel,
* hence all the functions of the JPanel
* belongs to this class, hence like
* as we call any other method of this
* class, without using the object,
* we can call repaint, likewise.
*/
x = me.getX();
y = me.getY();
repaint();
}
};

/*
* This JPanel panel is unnecessary in
* this case, since the class itself
* extends JPanel, hence you can use
* this (keyword) to access the instance
*/
//JPanel panel;
// Not needed for this case.
//JButton button2;
//JButton button;
public void game() {

JFrame frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setResizable(false);
addMouseMotionListener(mouseActions);
/*
* Here this means the instance
* of the current class
*/
frame.add(this);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

/*
* While overriding methods of the
* super class, try to keep the
* ACCESS SPECIFIER, as close to
* the original thingy as possible
* In this case, it's protected
* and not public
*/
@Override
protected void paintComponent(Graphics g) {

/*
* Do not perform calculation in this method
* atleast.
*/
super.paintComponent(g);
g.fillRect(x, y, 100, 100);
}

public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new Game().game();
}
};
EventQueue.invokeLater(runnable);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
}

关于Java - 重新绘制 JPanel 会出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17572495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com