Java 尝试制作一个JFrame,其中包含两个拥有自己类的JPanel,然后使用MouseStener在这两个JPanel上绘制形状

Java 尝试制作一个JFrame,其中包含两个拥有自己类的JPanel,然后使用MouseStener在这两个JPanel上绘制形状,java,swing,Java,Swing,我所有的代码都会一直工作到实际需要绘制形状的时候。当在mouseReleased()方法中调用shapeDrawer()时,我得到一个NullPointerExeception。我试过很多东西,但似乎都想不出来。我们的想法是在我的主类中创建一个JFrame,然后创建两个面板的对象并将它们添加到框架中,然后使用mousePressed()和mouseerelease()来绘制一个形状,而不会使两个面板上的形状重叠。一个面板绘制一个仅出现在一个面板上的矩形,然后另一个面板绘制一个仅出现在一个面板上的

我所有的代码都会一直工作到实际需要绘制形状的时候。当在
mouseReleased()
方法中调用
shapeDrawer()
时,我得到一个
NullPointerExeception
。我试过很多东西,但似乎都想不出来。我们的想法是在我的主类中创建一个
JFrame
,然后创建两个面板的对象并将它们添加到框架中,然后使用
mousePressed()
mouseerelease()
来绘制一个形状,而不会使两个面板上的形状重叠。一个面板绘制一个仅出现在一个面板上的矩形,然后另一个面板绘制一个仅出现在一个面板上的椭圆形。两个
JPanel
类都是彼此的碳拷贝,不同的是一个绘制椭圆形,一个绘制矩形。任何帮助都会令人惊讶的我已经被困在这个问题上好几个小时了

堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at DemoJPanel1.shapeDrawer(DemoJPanel1.java:18)
    at DemoJPanel1.mouseReleased(DemoJPanel1.java:50)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
谢谢! 布雷特·谢普利

JPanel一级

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类DemoJPanel1扩展了JPanel,实现了MouseListener、ItemListener、ActionListener、MouseMotionListener{
JPanel mainPanel=新的JPanel();
int startX、startY、endX、endY;
/*--------设置JPanel的默认构造函数--------*/
DemoJPanel1(){
主面板。设置首选尺寸(新尺寸(300300));
主面板。背景(颜色。蓝色);
主面板。addMouseListener(此);
}
/*--------形状绘制功能--------*/
公共空心形状的墙(){
Graphics2D g2=(Graphics2D)getGraphics();
g2.设置颜色(颜色为白色);
int width=Math.abs(endX startX);
int height=Math.abs(endY startY);
minAndMax();
g2.fillRect(星形、星形、宽度、高度);
}
公共空间最小值和最大值(){
如果(开始发送>结束发送){
int temp=startX;
startX=endX;
endX=温度;
}
如果(开始>结束){
内部温度=起始温度;
startY=endY;
endY=温度;
}
}
/*--------鼠标运动功能--------*/
@凌驾
公共无效鼠标按下(MouseEvent e){
系统输出打印项次(“测试1”);
this.startX=e.getX();
this.startY=e.getY();
}
@凌驾
公共无效MouseEvent(MouseEvent e){
this.endX=e.getX();
this.endY=e.getY();
shapeDrawer();
}
}

您发布的代码不是一个密码。尽管如此,我还是设法将其转换为一个,然后我意识到应该删除类
DemoJPanel1
mainPanel
成员。在我删除它之后,您的代码运行良好

我还删除了除了
MouseListener
之外的所有“监听器”,因为这些监听器根本不用

这是我修改过的代码。请注意,我还添加了
main()
方法,以便使下面的代码成为MRE

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics2D;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类DemoJPanel1扩展了JPanel实现MouseListener{
int startX、startY、endX、endY;
/*--------设置JPanel的默认构造函数--------*/
DemoJPanel1(){
setPreferredSize(新尺寸(300300));
挫折背景(颜色:蓝色);
addMouseListener(这个);
}
/*--------形状绘制功能--------*/
公共空心形状的墙(){
Graphics2D g2=(Graphics2D)getGraphics();
g2.设置颜色(颜色为白色);
int width=Math.abs(endX-startX);
int height=Math.abs(endY-startY);
minAndMax();
g2.fillRect(星形、星形、宽度、高度);
}
公共空间最小值和最大值(){
如果(开始发送>结束发送){
int temp=startX;
startX=endX;
endX=温度;
}
如果(开始>结束){
内部温度=起始温度;
startY=endY;
endY=温度;
}
}
/*--------鼠标运动功能--------*/
@凌驾
公共无效鼠标按下(MouseEvent e){
系统输出打印项次(“测试1”);
this.startX=e.getX();
this.startY=e.getY();
}
@凌驾
公共无效MouseEvent(MouseEvent e){
this.endX=e.getX();
this.endY=e.getY();
shapeDrawer();
}
@凌驾
公共无效mouseClicked(MouseEvent e){
}
@凌驾
公共无效鼠标事件(鼠标事件e){
}
@凌驾
公共无效mouseExited(MouseEvent e){
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
JFrame=新JFrame();
DemoJPanel1面板=新的DemoJPanel1();
框架。添加(面板);
框架。设置尺寸(300400);
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
});
}
}

您发布的代码不是一个密码。尽管如此,我还是设法将其转换为一个,然后我意识到应该删除类
DemoJPanel1
mainPanel
成员。在我删除它之后,您的代码运行良好

我还删除了除了
MouseListener
之外的所有“监听器”,因为这些监听器根本不用

这是我修改过的代码。请注意,我还添加了
main()
方法,以便使下面的代码成为MRE

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics2D;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JFrame;
导入javax
public class DemoJPanel1 extends JPanel implements MouseListener,ItemListener,ActionListener,MouseMotionListener {
    //keep most of what you have but add field.
    Rectangle rectangle = new Rectangle(0,0,0,0);
    /*--------Shape Painter Function--------*/
    public void shapeDrawer() {
        int width = Math.abs(endX - startX);
        int height = Math.abs(endY - startY);
        minAndMax();
        rectangle.setBounds(startX, startY, width, height);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.WHITE);
        ((Graphics2D)g).fill(rectangle);
    }
}