0

OK, so I had an issue where my images weren't showing when the .jar file was run.

Fixed that by using a fix from robberman I think his tag was.

Anyways once I fixed that by getting the images from getResourceAsStream etc it worked fine. So when creating the background image, a JLabel with an image, and JButtons with images as new components, this works great!

Problem I keep running into now is I have 3 buttons that need to change their icons in certain situations. I've tested this and it works without the NullPointerException in my test class, but when I try this in my projects class I get a NullPointerException each time it tries to setIcon.

Here's the method I setup to change the Icon. (I've tried this many different ways, and thought this would be easiest to see since it happens no matter what I do. ) Here's the constructor, the createGUI and the method to change the icons. Please help me out figuring what I'm doing wrong.

public class Addons {
// Setup any variables needed for this class to run
private JPanel addonsList;
private JLabel patchNotes;
private JProgressBar progressBar;
private JTable addonsTable;
private SaveSettings sav;
private Updater util;
private JButton instructions;
private JButton installButton;
private JButton finishedButton;
private boolean finishedAll;
private boolean upAvail;
private Task task;

// Setup the tables for use in the listings

    /**
*   Default constructor
*
*/
public Addons(Updater util) {
    // Load up the saved settings.
    sav = new SaveSettings();
    sav.loadSave();
    this.util = util;
    finishedAll = false;
    upAvail = false;
    createAddonsGUI();
}

/**
*   This method will create the gui for use in the constructor
*
*/
private void createAddonsGUI() {
    // create base panel
    addonsList = new JPanel();
    addonsList.setPreferredSize(new Dimension(800,435));
    addonsList.setOpaque(false);
    SpringLayout addonsListLO = new SpringLayout();
    addonsList.setLayout(addonsListLO);

    // Create and place scroll frame with patch notes panel in it.
    JScrollPane patchNotesPanel = createPatchNotesPanel();
    patchNotesPanel.setPreferredSize(new Dimension(370,300));
    addonsList.add(patchNotesPanel);

    // create and place progress bar
    //JLabel progressBarBackground = new JLabel(new ImageIcon(util.PROGBACK_IMAGE_PATH));
    JLabel progressBarBackground = new JLabel();
    try {           
        Image mypBarPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/ProgressBackground.png"));
        progressBarBackground = new JLabel(new ImageIcon(mypBarPic));
    } catch (IOException ignore) {
        System.out.println("Error: " + ignore.getMessage());
    }
    addonsList.add(progressBarBackground);
    SpringLayout pBarLO = new SpringLayout();
    progressBarBackground.setLayout(pBarLO);
    progressBarBackground.setOpaque(false);
    progressBar = new JProgressBar(0, 100);
    progressBar.setValue(0);
    progressBar.setStringPainted(true);
    progressBarBackground.add(progressBar);
    pBarLO.putConstraint(SpringLayout.WEST, progressBar, 21, SpringLayout.WEST, progressBarBackground);
    pBarLO.putConstraint(SpringLayout.NORTH, progressBar, 15, SpringLayout.NORTH, progressBarBackground);
    pBarLO.putConstraint(SpringLayout.EAST, progressBar, -21, SpringLayout.EAST, progressBarBackground);
    pBarLO.putConstraint(SpringLayout.SOUTH, progressBar, -45, SpringLayout.SOUTH, progressBarBackground);

    // Create and place Finish button
    //finishedButton = new JButton(new ImageIcon(util.FINOFF_IMAGE_PATH));
    //public static final String FINOFF_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\FinishedOff.png";
    JButton finishedButton = new JButton();
    try {           
        Image myfinishedButtonPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/FinishedOff.png"));
        finishedButton = new JButton(new ImageIcon(myfinishedButtonPic));
    } catch (IOException ignore) {
        System.out.println("Error: " + ignore.getMessage());
    }
    finishedButton.setBorderPainted(false);
    finishedButton.setContentAreaFilled(false);
    finishedButton.setFocusPainted(false);
    finishedButton.setOpaque(false);
    finishedButton.setToolTipText("<html><font size=6>When button glows blue, you're all done and you can press this to close the udpater.</font></html>");
    finishedButton.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) { if(finishedAll) {System.exit(0);} }
    });
    addonsList.add(finishedButton);

    // Create and place Install Addons Button
    //installButton = new JButton(new ImageIcon(util.INSTOFF_IMAGE_PATH));
    //public static final String INSTOFF_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\InstallUpdatesOFF.png";
    JButton installButton = new JButton();
    try {           
        Image myinstallButtonPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/InstallUpdatesOFF.png"));
        installButton = new JButton(new ImageIcon(myinstallButtonPic));
    } catch (IOException ignore) {
        System.out.println("Error: " + ignore.getMessage());
    }
    installButton.setBorderPainted(false);
    installButton.setContentAreaFilled(false);
    installButton.setFocusPainted(false);
    installButton.setOpaque(false);
    installButton.setToolTipText("<html><center><font size=6>When arrows to the left of this button glow blue, you have updates to install.<br /> <br />Press this button to get the updated versions of your addons.</font></center></html>");
    installButton.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) { 
            // This will handle installing needed updates
            if(upAvail) { 
                JFrame root = util.getRootFrame();
                root.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                task = new Task();
                task.execute();
                root.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            }
        }
    });
    addonsList.add(installButton);

    // Create and place scroll frame with the addons list table in it.
    JPanel addonListPanel = new JPanel();
    addonListPanel.setPreferredSize(new Dimension(388,245));
    addonsTable = new JTable(new DynastyTableModel());
    JTableHeader header = addonsTable.getTableHeader();
    ColumnHeaderToolTips tips = new ColumnHeaderToolTips();
    header.addMouseMotionListener(tips);
    addonListPanel.setLayout(new BorderLayout());
    addonListPanel.add(addonsTable.getTableHeader(), BorderLayout.PAGE_START);
    addonListPanel.add(new JScrollPane(addonsTable), BorderLayout.CENTER);
    // setup table settings
    addonsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    addonsTable.setRowSelectionAllowed(true);
    addonsTable.setColumnSelectionAllowed(false);
    addonsTable.setBackground(Color.BLACK);
    addonsTable.setForeground(Color.WHITE);
    //addonsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    addonsTable.setFillsViewportHeight(true);
    addonsTable.setPreferredScrollableViewportSize(addonListPanel.getPreferredSize());
    addonsTable.setRowHeight(31);
    // setup column width and editing
    fitToContentWidth(addonsTable, 0);
    fitToContentWidth(addonsTable, 1);
    fitToContentWidth(addonsTable, 2);
    fitToContentWidth(addonsTable, 3);
    fitToContentWidth(addonsTable, 4);
    // properly align text in cells
    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
    addonsTable.getColumn("Version").setCellRenderer( centerRenderer );
    //addonsTable.getColumn("Purchase").setCellRenderer( centerRenderer );
    addonsTable.getColumn("Size").setCellRenderer( centerRenderer );
    //addonsTable.getColumn("Update").setCellRenderer( centerRenderer );
    addonsTable.getColumn("Name").setCellRenderer( centerRenderer );
    // setup list selector
    ListSelectionModel listSelectionModel = addonsTable.getSelectionModel();
    listSelectionModel.addListSelectionListener(new SharedListSelectionHandler());
    addonsTable.setSelectionModel(listSelectionModel);

    addonListPanel.setOpaque(false);
    addonsList.add(addonListPanel);

    // Create and place the view instructions button.
    //instructions = new JButton(new ImageIcon(util.INSTRUCTIONS_BUTTON));
    //public static final String INSTRUCTIONS_BUTTON = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\instructions.png";
    JButton instructions = new JButton();
    try {           
        Image myinstructionsPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/instructions.png"));
        instructions = new JButton(new ImageIcon(myinstructionsPic));
    } catch (IOException ignore) {
        System.out.println("Error: " + ignore.getMessage());
    }
    instructions.setBorderPainted(false);
    instructions.setContentAreaFilled(false);
    instructions.setFocusPainted(false);
    instructions.setOpaque(false);
    instructions.setToolTipText("<html><center><font size=6>When this button shows purchase you can click it to go purchase the selected addon.<br /><br /> When it's showing Instructions you can click it to go see the manual for the selected addon.</font></center></html>");
    // Deal with nothing selected when clciking this.
    instructions.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            int row = addonsTable.getSelectedRow();
            String ad = "";             
            DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
            if ( row == -1 ) { return; }
            if ( row == 1 || row == 0 || row == 2 ) { ad = "Booster"; }
            else {  
                ad = (String) tm.getValueAt(row,1);
                ad = ad.replaceAll("\\s+", "");
            }
            boolean purchased = (Boolean) tm.getValueAt(row,3);
            if (purchased) {
                sendTo(ad, 1);
            } else {
                sendTo(ad,0);
            }
        }
    });
    addonsList.add(instructions);

    // Constrain all items to the base panel
    addonsListLO.putConstraint(SpringLayout.EAST, patchNotesPanel, -18, SpringLayout.EAST, addonsList);
    addonsListLO.putConstraint(SpringLayout.NORTH, patchNotesPanel, 0, SpringLayout.NORTH, addonsList);
    addonsListLO.putConstraint(SpringLayout.SOUTH, progressBarBackground, -20, SpringLayout.SOUTH, addonsList);
    addonsListLO.putConstraint(SpringLayout.WEST, progressBarBackground, 100, SpringLayout.WEST, addonsList);
    addonsListLO.putConstraint(SpringLayout.EAST, finishedButton, 0, SpringLayout.EAST, addonsList);
    addonsListLO.putConstraint(SpringLayout.SOUTH, finishedButton, -20, SpringLayout.SOUTH, addonsList);
    addonsListLO.putConstraint(SpringLayout.SOUTH, installButton, -10, SpringLayout.NORTH, progressBarBackground);
    addonsListLO.putConstraint(SpringLayout.WEST, installButton, 190, SpringLayout.WEST, addonsList);
    addonsListLO.putConstraint(SpringLayout.WEST, addonListPanel, 18, SpringLayout.WEST, addonsList);
    addonsListLO.putConstraint(SpringLayout.NORTH, addonListPanel, 0, SpringLayout.NORTH, addonsList);
    addonsListLO.putConstraint(SpringLayout.NORTH, instructions, -180, SpringLayout.SOUTH, addonsList);
    addonsListLO.putConstraint(SpringLayout.WEST, instructions, 20, SpringLayout.WEST, addonsList);

}


/**
*   This will update the table with info from the users database entry.
*
*/
public void updateTable() {
    String totalIn = "";
    String s = "";
    String aName = "";
    String aVersion = "";
    String aFileSize = "";
    String aInfo = "";          
    DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
    sav.loadSave();
    try {
        URL serverURL = new URL(Updater.URL_CONNECT + "action=get_addons&email=" + sav.getSetting("UserName") + "&PHPSESSID=" + util.getPHPSessionID());
        HttpURLConnection serverConnection = (HttpURLConnection) serverURL.openConnection();
        serverConnection.setRequestMethod("GET");
        BufferedReader in = new BufferedReader(new InputStreamReader(serverConnection.getInputStream()));
        while (( totalIn = in.readLine()) != null) {
            s += totalIn;
        }
        String[] splitOne = s.split("\\|-\\|");
        for ( int a = 0; a < splitOne.length; a++) {
            String[] splitTwo = splitOne[a].split("\\|");
            String addonName = splitTwo[0];
            for ( int b = 0; b < tm.getRowCount(); b++) {
                if ( addonName.equals( (String) tm.getValueAt(b,1) ) ) { // b is the correct place to place the table info into addons[][]
                    tm.setValueAt(splitTwo[1],b,2);
                    tm.setValueAt(true,b,3);
                    double byteSize = Double.parseDouble(splitTwo[2]);
                    double kbyteSize = (byteSize/1024.0);
                    DecimalFormat dec = new DecimalFormat("00.00");
                    tm.setValueAt(dec.format(kbyteSize),b,4);
                    pNotes[b][0] = splitTwo[3];
                }
            }
        }
    } catch (MalformedURLException e) {
        JOptionPane.showMessageDialog(null, "Please send this entire error to support@dyanstyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 22", "Attention!",JOptionPane.ERROR_MESSAGE);           
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "Please send this entire error to support@dynastyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 23" + e.getMessage(), "Attention!",JOptionPane.ERROR_MESSAGE);      
    }
    checkLocalAddons();
}

/**
*   This method checks the version numbers to see what what needs updating
*   then updates the table to reflect this.
*
*/
private void needsUpdate() {
    DynastyTableModel tm = (DynastyTableModel)addonsTable.getModel();
    for ( int a = 0; a < tm.getRowCount(); a++) {
        String ver = (String) tm.getValueAt(a,2).toString();
        if(!ver.equals(localVersion[a][0])) { 
            boolean purch = (boolean) tm.getValueAt(a,3);
            System.out.println("Set value at " + a + " 0 to: " + purch);
            if(purch) {tm.setValueAt(true,a,0);}
        }else{
            tm.setValueAt(false,a,0);
        }
    }
    checkUpdatesAvail();
}

/**
*   This method will check if any of the udpate boxes are checked, and update the install button.
*
*
*/
private void checkUpdatesAvail() {
    DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
    boolean update = false;
    for ( int a = 0; a < tm.getRowCount(); a++) {
        boolean u = (Boolean) tm.getValueAt(a,0);
        if (u) { update = u; }
    }
    if (update) {           
        setImageOnButton("instOn");
        upAvail = true;
    } else { finishedEverything(); }
}

/**
*   This method handles what happens when you click the Install Updates button.
*
*/
private void updateNeededAddons() {

    DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
    boolean[] addUp = {false,false,false,false,false,false,false};
    for (int a = 0; a < tm.getRowCount(); a++) {
        boolean update = (Boolean) tm.getValueAt(a,0);
        int getResult = 2;
        if (update) {
            addUp[a] = true;
            try {

                URL dlAddon = new URL(util.URL_CONNECT + "action=download&addon=" + tm.getValueAt(a,1) + "&email=" + sav.getSetting("UserName") + "&PHPSESSID=" + util.getPHPSessionID());      
                String fileName = tm.getValueAt(a,1) + ".zip";
                String fileS = (String) tm.getValueAt(a,4);
                double fileSize = Double.parseDouble(fileS);
                getResult = getAddons(dlAddon, fileName, fileSize);
            } catch(MalformedURLException e) {
                JOptionPane.showMessageDialog(null, "We tried to create a query to download your addons, but got a malformedURLException. Please send this entire error to support@dyanstyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 31", "Attention!",JOptionPane.ERROR_MESSAGE);      

            }
            if(getResult == 1) { 
                installAddon((String)tm.getValueAt(a,1)); 
            }
        }
    }
}

/**
*   This method will update the patch notes panel, 
*   it only allows updating from within this class.
*
*   @param txt      The new txt for the patch notes panel.
*
*/
private void setPatchNotes(String txt) {
    patchNotes.setText(txt);
    int prefSize = 370;
    boolean width = true;
    View view = (View) patchNotes.getClientProperty(javax.swing.plaf.basic.BasicHTML.propertyKey);
    view.setSize(width ? prefSize : 0, width ? 0 : prefSize);
    float w = view.getPreferredSpan(View.X_AXIS);
    float h = view.getPreferredSpan(View.Y_AXIS);
    patchNotes.setPreferredSize(new Dimension((int) Math.ceil(w) - 17, (int) Math.ceil(h) + 100));
}

/**
*   This will query the server for the updates to the addons
*   that are needed and download them as needed.
*
*/
private int getAddons(URL url, String localFilename, double len) {
    InputStream is = null;
    FileOutputStream fos = null;

    try {
        URLConnection urlConn = url.openConnection();
        HttpURLConnection resp = (HttpURLConnection) urlConn;
        int responseCode = resp.getResponseCode();
        is = urlConn.getInputStream();
        fos = new FileOutputStream(System.getenv("SystemDrive") + "\\DynastyAddons\\" + localFilename);

        byte[] buffer = new byte[4096];
        int leng = (int) len;

        while ((leng = is.read(buffer)) > 0) {
            fos.write(buffer,0,leng);
        }
        is.close();
        fos.close();
        return 1;
    } catch (MalformedURLException e) {
        JOptionPane.showMessageDialog(null, "We tried to download your addons, but got a malformedURLException. Please send this entire error to support@dyanstyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 32", "Attention!",JOptionPane.ERROR_MESSAGE);            
        return 2;
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "We tried to download your addons, but got an IOException. Please send this entire error to support@dynastyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 33" + e, "Attention!",JOptionPane.ERROR_MESSAGE);         
        return 2;
    }
}



/**
*   This will update the finished button once all is done.
*
*/
private void finishedEverything() { 

        setImageOnButton("instOff");
        setImageOnButton("finOn");
        upAvail = false;
        finishedAll = true;

}

    public void setImageOnButton(String buttonName){
    ImageIcon icon;
    switch(buttonName) {
        case "purchase":    try {
                                System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/Purchase.png exists? " + new File("com/dynastyaddons/updater/Purchase.png").exists());
                                Image pic1 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/Purchase.png"));
                                icon = new ImageIcon(pic1);
                                instructions.setIcon(icon);
                            } catch (IOException e) { System.out.println("IO Exception setting icon to instructions: " + e.getMessage()); }
                            break;
        case "instructions":try {
                                System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/instructions.png exists? " + new File("com/dynastyaddons/updater/instructions.png").exists());
                                Image pic2 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/instructions.png"));
                                icon = new ImageIcon(pic2);
                                instructions.setIcon(icon);
                            } catch (IOException e) { System.out.println("IO Exception setting icon to instructions2: " + e.getMessage()); }
                            break;
        case "finOn":       try {
                                System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/FinishedOn.png exists? " + new File("com/dynastyaddons/updater/FinishedOn.png").exists());
                                Image pic3 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/FinishedOn.png"));   
                                icon = new ImageIcon(pic3);
                                finishedButton.setIcon(icon);                               
                            } catch (IOException e) { System.out.println("IO Exception setting icon to finished: " + e.getMessage()); }
                            break;
        case "finOff":      try {
                                System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/FinishedOff.png exists? " + new File("com/dynastyaddons/updater/FinishedOff.png").exists());
                                Image pic4 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/FinishedOff.png"));
                                icon = new ImageIcon(pic4);
                                finishedButton.setIcon(icon);
                            } catch (IOException e) { System.out.println("IO Exception setting icon to finished2: " + e.getMessage()); }
                            break;
        case "instOn":      try {
                                System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/InstallUpdatesON.png exists? " + new File("com/dynastyaddons/updater/InstallUpdatesON.png").exists());
                                Image pic5 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/InstallUpdatesON.png"));
                                icon = new ImageIcon(pic5);
                                installButton.setIcon(icon);
                            } catch (IOException e) { System.out.println("IO Exception setting icon to install: " + e.getMessage()); }
                            break;
        case "instOff":     try {
                                System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/InstallUpdatesOFF.png exists? " + new File("com/dynastyaddons/updater/InstallUpdatesOFF.png").exists());
                                Image pic6 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/InstallUpdatesOFF.png"));
                                icon = new ImageIcon(pic6);
                                installButton.setIcon(icon);
                            } catch (IOException e) { System.out.println("IO Exception setting icon to install2: " + e.getMessage()); }
                            break;
    }
}


// This internal class will handle the modle for the table used to show the addon list.
class DynastyTableModel extends AbstractTableModel {
    private String[] columnNames = {"Update",
                                    "Name",
                                    "Version",
                                    "Purchase",
                                    "Size"};
    private Object[][] initialData = {
        {new Boolean(false), "Booster", new Double(1.0), new Boolean(false), new Double(0)},
        {new Boolean(false), "BoosterAlliance", new Double(1.0), new Boolean(false), new Double(0)},
        {new Boolean(false), "BoosterHorde", new Double(1.0), new Boolean(false), new Double(0)},
        {new Boolean(false), "Edge", new Double(1.0), new Boolean(false), new Double(0)},
        {new Boolean(false), "Impulse", new Double(1.0), new Boolean(false), new Double(0)},
        {new Boolean(false), "Tycoon", new Double(1.0), new Boolean(false), new Double(0)},
        {new Boolean(false), "DynastyCore", new Double(1.0), new Boolean(false), new Double(0)},
    };

    public int getColumnCount() { return columnNames.length; }
    public int getRowCount() { return initialData.length; }
    public String getColumnName(int col) { return columnNames[col]; }
    public Object getValueAt(int row, int col) { return initialData[row][col]; }
    public Class getColumnClass(int c) { return getValueAt(0,c).getClass(); }
    @Override
    public void setValueAt(Object value, int row, int col) {
        initialData[row][col] = value;
        fireTableCellUpdated(row, col);
    }
}

// This internal class will help handle when a row is selected in the table. 
class SharedListSelectionHandler implements ListSelectionListener {
    public void valueChanged(ListSelectionEvent e) {
        if ( !e.getValueIsAdjusting() ) {
            ListSelectionModel lsm = (ListSelectionModel)e.getSource();
            int selected = lsm.getMinSelectionIndex();
            // if purchased addon display patch notes
            DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
            boolean selectedValue = (Boolean) tm.getValueAt(selected,3);
            if ( selectedValue ) { 
                setPatchNotes(pNotes[selected][0]); 
                setImageOnButton("instructions");
            }
            else { // Otherwise update Install Instructions button to show Purchase instead. 
                // save currently selected addon name for use in the purchase button?
                String p = "";
                if (selected == 1 || selected == 2) {
                    p = "Booster";
                } else { p = (String) tm.getValueAt(selected,1); }
                setPatchNotes("<HTML>You have not purchased this addon, please go to http://dynastyaddons.com/" + p + " or click the Purchase button below the list of addons here to open the purchase page.</HTML>"); 
                setImageOnButton("purchase");

            }
        }
    }
}
}

As you see from the above code, the createGUI where I create the buttons using getResource() etc works fine, it's the setImagesOnButton() method at the bottom that's giving me fits.

I tried also to include the places where the method is called to make it more clear. Also the println's in the setImagesOnButton all print out that the file is found and exists, then in the next line a NullPointerException comes up saying it doesn't exist? Confusing to me.

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
Jason Langois
  • 41
  • 1
  • 8
  • Have you tried `/com/dynastyaddons/updater/....png`? What IDE are you using? – MadProgrammer Jun 24 '14 at 04:37
  • You might also like to have a read through [Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?](http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) – MadProgrammer Jun 24 '14 at 04:39
  • If `File#exists` is printing `true` I'd be concered about the location of your files – MadProgrammer Jun 24 '14 at 04:43
  • It shouldn't take over 500 LOC to demonstrate this problem! For better help sooner, post an [MCVE](http://stackoverflow.com/help/mcve) (Minimal Complete and Verifiable Example). – Andrew Thompson Jun 24 '14 at 04:54
  • Please have a look at, how to [add images to Java Project](http://stackoverflow.com/a/9866659/1057230). Hopefully this be of some help on the topic :-) – nIcE cOw Jun 24 '14 at 04:55
  • *"it's the `setImagesOnButton()` method at the bottom that's giving me fits."* What *"`setImagesOnButton()` method"*?!? – Andrew Thompson Jun 24 '14 at 04:57
  • The files are located in the src folder with the java files ,and the classes folder with the classes. The setImageOnButton is near the bottom, third method up from the bottom. I included most of the file, because I wrote a small test file and it worked fine. So I'm including the code in the post here because it seems to me it's likely some of that code that's cuasing the issue. What gets me is that using the exact same cdoe in the createGUI method at the top I set the images to the new jbutton and it works fine. it's just the setIcon method that's getting the null pointer. I use notepad++ – Jason Langois Jun 24 '14 at 05:07
  • OK, so I change it up a bit, and took out the classloader, made a URL and did JButton.setIcon(new ImageIcon(url)); still getting can't find error. But the println above says the file is existing. Plus again the code up top where I create the buttons works great using the getclass()getclassloader().getresource(path to image); just not the setIcon. :( – Jason Langois Jun 24 '14 at 05:30
  • @MadProgrammer Honestly I tried not to use those methods much, but the requirements I was given was to keep the frame from re-sizing and the root needs to be the same size as the picture used (all decorations are off, had to make my own close and minimize buttons even) and to ensure it all stayed the right size as they don't want the image to be resized, it was setup for 800X600 resolution and 'should' look the same on every other resolution as it does on 800X600 so I felt a little use of setpreferredsize was warranted in this case. – Jason Langois Jun 24 '14 at 05:38
  • The problem is, the size of a component is affected not by the size of the frame so much as the underlying platform and rendering pipelines. So even if you "try" and make it static, it won't ever be... – MadProgrammer Jun 24 '14 at 05:41
  • @MadProgrammer OH! So that makes so much more sense than anything on that link you sent. I think they were just too smart for me! OK, i'll jump on taking those out and ensuring my SpringLayouts and CardLayout do the job instead! I appreciate the heads up on that. :) Soon as I fix this stupid setIcon issue.. :( – Jason Langois Jun 24 '14 at 05:50
  • Is the program Jared or are you just compiling the classes and running them directly? – MadProgrammer Jun 24 '14 at 05:51
  • Right now I'm just running the compiled classes. I had a problem where the jared file was not showing any of the pictures, which is why I figured out the getResources and now they display from the jar, but I can't get those setIcon methods working at compiletime without giving me the null pointer, while the new JButton(getResource()) code works fine, the exact same code in the setIcon isn't working. Once I get the setIcon working from the compiles i'll jar it up again and test it out on a couple diff computers around the house to see if it'll work there as well. – Jason Langois Jun 24 '14 at 06:02
  • Thought directory structure might make things a little more clear. I have 2 directories, one for src and one for classes. First is like this F://Updater/src/com/dynastyaddons/updater/*.java and *.png Second direcotyr is F://Updater/classes/com/dynastyaddons/updater/*.class and *.png I compile using .bat in F://Updater/classes and that's where my CreateJar.bat is as well. and all .java have `package com.dynastyaddons.updater` at the top line of each class. – Jason Langois Jun 24 '14 at 06:50
  • Please check the package of AddOn class and resource folder of the specified image. If both are same you need not specified the full path but the name of the image. If the image contains some inner folder of the package of AddOn class then specify the path from the package of AddOn class. for pointing parent directory (resource folder) try with ../ – A Stranger Jun 24 '14 at 08:42
  • OK, tried that, `System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/InstallUpdatesOFF.png exists? " + new File("com/dynastyaddons/updater/InstallUpdatesOFF.png").exists()); URL url6 = getClass().getResource("InstallUpdatesOFF.png"); if(url6 == null) {System.out.println("Could not find url6");} else {installButton.setIcon(new ImageIcon(url6));} break;` It got to the installButton.setIcon(new ImageIcon(urlg))) and threw the null pointer error. Any more ideas?\ – Jason Langois Jun 24 '14 at 23:49

1 Answers1

0

OK, I figured out what was going on. Three things to fix this. First of all, I realized that the null problem was not the icon I was trying to put on the button, it was a misplaced JButton call at the top in the CreateGUI method. I removed that (since I had it already created in the constructor) and that went away. Second I got rid of the stupd method cause it kept confusing me. (the setImageOnButton) and finally I found that if I put the images directory in the root of the package, then called for the images using new ImageIcon(Image.read(getClass().getClassLoader().getResourceAsStream("images/imagename.png"))); I could find it since I was relating it to the package rather than the class, it worked like a charm! I compiled, jarred it up and tested on my wifes' computer and it worked perfect! Thank you all for the help, Couldn't have done it without all the great info! and to say the least, I completely understand resources and how to put them in an application and use them now. :)

Jason Langois
  • 41
  • 1
  • 8