Search code examples
javajprogressbar

Java JProgressbar doesn't update, unknown source error


I'm learning on my own to program in java and i'm trying to make a health bar, the health shows up but when i press the "up" button (i am making a skeleton for a simple 2d game and that button is just to know the command) the health doesn't go down. When i press the button 3 times this shows up on my cmd:

https://i.sstatic.net/ydJGJ.png

Here is my code:

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

public class test{

    private static JFrame frame = new JFrame("test");

    private static JPanel panel = new JPanel();
    private static JPanel panel1 = new JPanel();
    private static JPanel panel2 = new JPanel();

    private static JButton button1 = new JButton("UP");
    private static JButton button2 = new JButton("DN");
    private static JButton button3 = new JButton("L");
    private static JButton button4 = new JButton("R");

    private static JLabel background = new JLabel(new ImageIcon("C:\\Users\\beau\\Downloads\\background.jpg"));

    private static int startHealth = 20;
    private static int healthBoost = 0;
    private static int maxHealth = startHealth + healthBoost;
    private static int damage = 0;
    private static int damageTaken;
    private static int curentHealth;


    public static void main(String[] args){
        //JFrame Properties
        frame.setSize(900,600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setVisible(true);


        //shown stuff Properties and Adding
        damageTaken += damage;
        curentHealth = maxHealth - damageTaken;

        JProgressBar health = new JProgressBar(0,curentHealth);
        health.setStringPainted(true);
        health.setString(curentHealth + "/" + maxHealth);
        health.setValue(curentHealth);

        frame.add(background);

        panel.setLayout(null);
        background.setLayout(null);

        button1.setBounds(61,420,50,50);
        button2.setBounds(61,520,50,50);
        button3.setBounds(11,470,50,50);
        button4.setBounds(111,470,50,50);
        panel.setBounds(725,0,175,600);
        health.setBounds(10,20,150,20);

        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        panel.add(button4);
        panel.add(health);
        background.add(panel);


        button1.addActionListener (new Action1());


        background.revalidate();
    }

    static class Action1 implements ActionListener{
        public void actionPerformed (ActionEvent e){
            damage = 5;
            main(new String[] {"a","b","c"});
        }
    }
    static class Action2 implements ActionListener{
        public void actionPerformed (ActionEvent e){

        }
    }
    static class ActionReset implements ActionListener{
        public void actionPerformed (ActionEvent e){

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

    public class test{

    private static JFrame frame = new JFrame("test");

    private static JPanel panel = new JPanel();
    private static JPanel panel1 = new JPanel();
    private static JPanel panel2 = new JPanel();

    private static JButton button1 = new JButton("UP");
    private static JButton button2 = new JButton("DN");
    private static JButton button3 = new JButton("L");
    private static JButton button4 = new JButton("R");

    private static JLabel background = new JLabel(new ImageIcon("C:\\Users\\beau\\Downloads\\background.jpg"));

    private static int startHealth = 20;
    private static int healthBoost = 0;
    private static int maxHealth = startHealth + healthBoost;
    private static int damage = 0;
    private static int damageTaken;
    private static int curentHealth;


    public static void main(String[] args){
        //JFrame Properties
        frame.setSize(900,600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setVisible(true);


        //shown stuff Properties and Adding
        damageTaken += damage;
        curentHealth = maxHealth - damageTaken;

        JProgressBar health = new JProgressBar(0,curentHealth);
        health.setStringPainted(true);
        health.setString(curentHealth + "/" + maxHealth);
        health.setValue(curentHealth);

        frame.add(background);

        panel.setLayout(null);
        background.setLayout(null);

        button1.setBounds(61,420,50,50);
        button2.setBounds(61,520,50,50);
        button3.setBounds(11,470,50,50);
        button4.setBounds(111,470,50,50);
        panel.setBounds(725,0,175,600);
        health.setBounds(10,20,150,20);

        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        panel.add(button4);
        panel.add(health);
        background.add(panel);


        button1.addActionListener (new Action1());


        background.revalidate();
    }

    static class Action1 implements ActionListener{
        public void actionPerformed (ActionEvent e){
            damage = 5;
            main(new String[] {"a","b","c"});
        }
    }
    static class Action2 implements ActionListener{
        public void actionPerformed (ActionEvent e){

        }
    }
    static class ActionReset implements ActionListener{
        public void actionPerformed (ActionEvent e){

        }
    }
}

I searched on google and a lot on stackoverflow.com but i didn't find any problem that looked like my problem. Can someone please help me with this problem?


Solution

  • You get These exception if max value is lower then the min value:

    new JProgressBar(0,-5);
    

    See this code:

      /**
         * Initializes value, extent, minimum and maximum. Adjusting is false.
         * Throws an <code>IllegalArgumentException</code> if the following
         * constraints aren't satisfied:
         * <pre>
         * min &lt;= value &lt;= value+extent &lt;= max
         * </pre>
         */
        public DefaultBoundedRangeModel(int value, int extent, int min, int max)
        {
            if ((max >= min) &&
                (value >= min) &&
                ((value + extent) >= value) &&
                ((value + extent) <= max)) {
                this.value = value;
                this.extent = extent;
                this.min = min;
                this.max = max;
            }
            else {
                throw new IllegalArgumentException("invalid range properties");
            }
        }