guanghezun 2019-11-23 19:29 采纳率: 0%
浏览 211

关于JPanel 点击鼠标画图的问题,会出现mousePressed空指针是为什么呢

public class iPanel extends JPanel {
private static final int FRAME_HEIGHT = 800;
private static final int FRAME_WIDTH = 800;
private JFrame frame;
private JPanel drawPanel;

private JToolBar toolbar;
private JButton lineButton;
private JButton rectangleButton;
private JButton ellipseButton;
private Color drawingColor;;
private int shape;
private int[] position;
public iPanel(){

this.frame = new JFrame("Easy Painting");
this.drawPanel = new JPanel();
toolbar = new JToolBar();
drawPanel.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
position[2]= e.getX();
position[3] = e.getY();
paint();
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
position[0] = e.getX();
position[1] = e.getY();
}
});
setupComponents();
}
private void setupToolbar(){
lineButton = new JButton ("line");
rectangleButton = new JButton ("rectangle");
ellipseButton = new JButton ("ellipse");
colorButton = new JButton ("color");
toolbar.add(lineButton);
toolbar.add(rectangleButton);
toolbar.add(ellipseButton);
toolbar.add(colorButton);
lineButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
shape = 0;
}
});
rectangleButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
shape = 1;
}
});
ellipseButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
shape = 2;
}
});
frame.add(toolbar, BorderLayout.NORTH);
}

private void setupComponents(){
    setupToolbar();
    frame.add(drawPanel, BorderLayout.CENTER);
    frame.setSize (FRAME_WIDTH, FRAME_HEIGHT);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint () {
    int startx = position[0];
    int starty = position[1];
    int endx = position[2];
    int endy = position[3];
    Graphics g = getGraphics();
    g.setColor(drawingColor);       
    switch (shape) {
    case 0:
        g.drawLine(startx, starty, endx, endy);
        break;
    case 1:
        g.drawRect(startx, starty, Math.abs(endx-startx), Math.abs(endy-starty));
        break;
    case 2:
        g.drawOval(startx, starty, Math.abs(endx-startx), Math.abs(endy-starty));
        break;
    case 3:
        g.drawRect(startx, starty, Math.abs(endx-startx), Math.abs(endx-startx));
        break;
    case 4:
        g.drawOval(startx, starty, Math.abs(endx-startx), Math.abs(endx-startx));
        break;          
     }  
}
public static void main(String[] args){
    new iPanel();
}

}
运行会报错:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at 1.mousePressed(java:63)
mouseReleased

  • 写回答

1条回答 默认 最新

  • 落鱼. 2022年度博客新星评选TOP 6 2024-03-04 00:15
    关注

    NullPointerException(空指针异常)发生在mousePressed方法中。这是因为position数组在使用前没有被初始化。在Java中,如果您声明了一个数组但没有显式地初始化它,那么数组的引用将为null。当您尝试访问数组的元素时,就会抛出空指针异常。

    为了解决这个问题,您需要在iPanel构造函数中初始化position数组。同时,您还需要在paint方法中调用super.paint(g)来确保正确地重绘组件。此外,您的paint方法中的case 3和case 4没有在switch语句中定义对应的按钮,这可能会导致逻辑错误。

    以下是修改后的代码片段:

    public class iPanel extends JPanel {
        // ... 省略其他代码 ...
    
        public iPanel() {
            // ... 省略其他代码 ...
            position = new int[4]; // 初始化position数组
            // ... 省略其他代码 ...
        }
    
        // ... 省略其他代码 ...
    
        public void paint(Graphics g) {
            super.paint(g); // 确保正确重绘组件
            // ... 省略其他代码 ...
        }
    
        // ... 省略其他代码 ...
    }
    
    

    请确保在iPanel构造函数中添加position = new int[4];这一行代码,以初始化position数组。这样,当您在mousePressed和mouseReleased方法中设置position数组的元素时,就不会抛出空指针异常了。

    另外,如果您想要在画布上绘制图形,通常需要重写paintComponent方法,而不是paint方法。paintComponent方法是JPanel的保护方法,用于绘制组件的内容。您可以在iPanel类中添加如下方法:

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // ... 省略其他代码 ...
    }
    
    

    这样,当您需要在画布上绘制图形时,可以直接调用drawPanel.repaint()来刷新画布。

    评论

报告相同问题?

悬赏问题

  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。
  • ¥15 SQL Server analysis services 服务安装失败
  • ¥15 基于面向对象的图书馆借阅管理系统
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥20 centos linux 7.9安装php8.2.18不支持mysqli模块的问题
  • ¥15 stata空间计量LM检验
  • ¥15 关于k8s node节点被释放后如何驱逐节点并添加新节点