【问题标题】:JButton setIcon nullPointerExceptionJButton setIcon nullPointerException
【发布时间】:2013-11-17 05:39:17
【问题描述】:

我的代码:

private JButton stopBotting = new JButton();
ImageIcon img = new ImageIcon(getClass().getResource(System.getProperty("user.dir") + "VisualBot/resources/play.png"));
stopBotting.setIcon(img);

add(stopBotting);

完整代码:

package bot;

import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class GuiBotting extends JFrame{

    private int controlWidth = 300;
    private int controlHeight = 78;
    private JButton startBotting = new JButton();
    private JButton stopBotting = new JButton();
    private JButton pauseBotting = new JButton();

    private GuiBotting(){

        setVisible(true);
        setResizable(false);
        setSize(controlWidth, controlHeight);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        setLayout(null);

        ImageIcon img = new ImageIcon(getClass().getResource(System.getProperty("user.dir") + "VisualBot/resources/play.png"));
        stopBotting.setIcon(img);

        eventStartBotting startBottingEvent = new eventStartBotting();
        eventStopBotting stopBottingEvent = new eventStopBotting();
        eventPauseBotting pauseBottingEvent = new eventPauseBotting();

        startBotting.addActionListener(startBottingEvent);
        stopBotting.addActionListener(stopBottingEvent);
        pauseBotting.addActionListener(pauseBottingEvent);

        startBotting.setBounds(0, 0, 100, 50);
        stopBotting.setBounds(0, 0, 50, 50);
        pauseBotting.setBounds(50, 0, 50, 50);

        add(stopBotting);
        add(pauseBotting);

        stopBotting.setVisible(false);
        pauseBotting.setVisible(false);

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(WindowEvent winEvt) {
                setVisible(false);
                dispose();

                VisualBot.stopBotting();

                GuiPreparation.openGui();
            }
        });

    }

    public class eventStartBotting implements ActionListener{
        public void actionPerformed(ActionEvent startBottingActionEvenr){
            System.out.println("Starting with botting...");
            VisualBot.startBotting();
            pauseBotting.setVisible(true);
            stopBotting.setVisible(true);
        }
    }

    public class eventStopBotting implements ActionListener{
        public void actionPerformed(ActionEvent stopBottingActionEvent) {

            System.out.println("Stopping with botting...");
            VisualBot.stopBotting();

            dispose(); 

            GuiPreparation.openGui();

        }

    }

    public class eventPauseBotting implements ActionListener{
        public void actionPerformed(ActionEvent pauseBottingActionEvent){
                System.out.println("Pausing botting...");
                VisualBot.pauseBotting();
                stopBotting.setBounds(0, 0, 100, 50);
                stopBotting.setVisible(false);
                pauseBotting.setVisible(false);
        }
    }

    public static void openGui(){
        GuiBotting guiBotting = new GuiBotting();

    }

}

当我打开 gui 时出现此错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at darkorbit.GuiBotting.<init>(GuiBotting.java:31)
    at darkorbit.GuiBotting.openGui(GuiBotting.java:98)
    at darkorbit.GuiPreparation$eventStartBotting.actionPerformed(GuiPreparation.java:255)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    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)
    etc...

我只是不明白,即使我设置了图像的完整路径,我也会得到 nullPointerException。我为此找到了很多答案并尝试了所有答案,但我还没有让它发挥作用。如果这很重要,我会使用 Eclipse

同样失败:

package bot;

import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class GuiBotting extends JFrame{

    private int controlWidth = 300;
    private int controlHeight = 78;
    private JButton startBotting = new JButton();
    private JButton stopBotting = new JButton();
    private JButton pauseBotting = new JButton();

    private GuiBotting(){

        setVisible(true);
        setResizable(false);
        setSize(controlWidth, controlHeight);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        setLayout(null);

        ImageIcon img = new ImageIcon(getClass().getResource(System.getProperty("user.dir") + "/VisualBot/resources/play.png"));
        stopBotting.setIcon(img);

        eventStartBotting startBottingEvent = new eventStartBotting();
        eventStopBotting stopBottingEvent = new eventStopBotting();
        eventPauseBotting pauseBottingEvent = new eventPauseBotting();

        startBotting.addActionListener(startBottingEvent);
        stopBotting.addActionListener(stopBottingEvent);
        pauseBotting.addActionListener(pauseBottingEvent);

        startBotting.setBounds(0, 0, 100, 50);
        stopBotting.setBounds(0, 0, 50, 50);
        pauseBotting.setBounds(50, 0, 50, 50);

        add(stopBotting);
        add(pauseBotting);

        stopBotting.setVisible(false);
        pauseBotting.setVisible(false);

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(WindowEvent winEvt) {
                setVisible(false);
                dispose();

                VisualBot.stopBotting();

                GuiPreparation.openGui();
            }
        });

    }

    public class eventStartBotting implements ActionListener{
        public void actionPerformed(ActionEvent startBottingActionEvenr){
            System.out.println("Starting with botting...");
            VisualBot.startBotting();
            pauseBotting.setVisible(true);
            stopBotting.setVisible(true);
        }
    }

    public class eventStopBotting implements ActionListener{
        public void actionPerformed(ActionEvent stopBottingActionEvent) {

            System.out.println("Stopping with botting...");
            VisualBot.stopBotting();

            dispose(); 

            GuiPreparation.openGui();

        }

    }

    public class eventPauseBotting implements ActionListener{
        public void actionPerformed(ActionEvent pauseBottingActionEvent){
                System.out.println("Pausing botting...");
                VisualBot.pauseBotting();
                stopBotting.setBounds(0, 0, 100, 50);
                stopBotting.setVisible(false);
                pauseBotting.setVisible(false);
        }
    }

    public static void openGui(){
        GuiBotting guiBotting = new GuiBotting();

    }

}

【问题讨论】:

    标签: java image swing embedded-resource


    【解决方案1】:
    ImageIcon img = new ImageIcon(getClass().getResource(
        System.getProperty("user.dir") + "VisualBot/resources/play.png"));
    

    user.dir 在这里没有用处。

    1. 这是一个实际的文件路径,而getResource(..) 使用的String 应该是一个String,它表示相对于类路径的路径。
    2. 它没有以/ 为后缀,因此需要显式添加它以形成有效路径。

    尝试改为:

    ImageIcon img = new ImageIcon(getClass().getResource(
        "/VisualBot/resources/play.png"));
    

    【讨论】:

    • :) +1 击败我,这可能是我第一次看到你回复帖子
    • @Sage 让您大饱眼福3,181 more。 ;)
    • 你是个足智多谋的家伙。我已经检查了其中一些。将与您讨论并在我深入重新检查它们时给它们加上一些 +1 ;)
    • 我添加了“/”,完全复制了你的代码,我仍然得到错误。
    • 您能否在您的问题中添加两件事作为edit to the question? 1) jar -tvf the.jar 的输出 2) 当前使用的代码。
    【解决方案2】:

    看起来img 必须为空。尝试在user.dir 和“VisualBot”之间添加/

    【讨论】:

      【解决方案3】:

      System.getProperty("user.dir"): 将返回用户目录,末尾没有名称分隔符:my/example/dir。不要直接使用\/,而是尝试使用File.seperator 在其后添加分隔符:系统相关的默认名称分隔符,为方便起见表示为字符串。

      【讨论】:

        【解决方案4】:

        行:

         ImageIcon img = new ImageIcon(getClass().getResource(System.getProperty("user.dir") + "VisualBot/resources/play.png"));
        

        产生NullPointerException。所以可能:System.getProperty("user.dir") 返回 null,因为您没有在运行时配置中定义 user.dir,或者属性已定义,但它指向不正确的目录,并且没有具有此类名称的文件。

        【讨论】:

        • “很可能:System.getProperty("user.dir") 为空..” 这表明 JRE 存在错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 2013-07-06
        • 2013-02-03
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多