0
package clickrpg2;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.Timer;

public class MainFrame extends javax.swing.JFrame implements ActionListener {

    static MainFrame mainFrame = new MainFrame();
    static Hero hero = new Hero();
    static JLabel fireballButton[] = new JLabel[1000000];
    static int fireballTotal = 0;
    Timer timer = new Timer(10, this);

    public MainFrame() {
        addKeyListener(new KeyThing());
        addMouseListener(new MouseThing());
        initComponents();
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/clickrpg2/StickMan1.png"))); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(1454, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(597, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    public static void main(String args[]) {
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                mainFrame.setVisible(true);
            }
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int c = 0;
        int x = 0;
        int y = 0;
        int xChar = jLabel1.getX();
        int yChar = jLabel1.getY();
        while (true) {
            x = fireballButton[c].getX();
            y = fireballButton[c].getY();
            fireballButton[c].setBounds(x + 5, y, 64, 32);
            c++;
            if (c == fireballTotal) {
                break;
            }
        }
        jLabel1.setBounds(xChar,yChar,64,64);
    }

    class KeyThing extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent e) {
            int x = jLabel1.getX();
            int y = jLabel1.getY();
            int speed = hero.getSpeed();
            jLabel1.setBounds(x, y, 64, 64);
            int keycode = e.getKeyCode();

            switch (keycode) {
                case KeyEvent.VK_LEFT:
                    jLabel1.setBounds(x - speed, y, 64, 64);
                    break;
                case KeyEvent.VK_RIGHT:
                    jLabel1.setBounds(x + speed, y, 64, 64);
                    break;
                case KeyEvent.VK_DOWN:
                    jLabel1.setBounds(x, y + speed, 64, 64);
                    break;
                case KeyEvent.VK_UP:
                    jLabel1.setBounds(x, y - speed, 64, 64);
                    break;
                case KeyEvent.VK_SPACE:
                    x = jLabel1.getX();
                    y = jLabel1.getY();
                    fireballButton[fireballTotal] = new JLabel();
                    fireballButton[fireballTotal].setPreferredSize(new Dimension(x, y));
                    mainFrame.getContentPane().add(fireballButton[fireballTotal], BorderLayout.CENTER);
                    ImageIcon label = new ImageIcon("C:\\Users\\Nick\\Documents\\NetBeansProjects\\ClickRPG2\\src\\clickrpg2\\Fireball.png");
                    fireballButton[fireballTotal].setIcon(label);
                    mainFrame.setVisible(true);
                    fireballButton[fireballTotal].setBounds(x, y, 64, 64);
                    mainFrame.add(fireballButton[fireballTotal]);
                    fireballTotal++;
                    timer.start();
                    if (fireballTotal > 900000) {
                        fireballTotal = 0;
                    }
                    break;
            }
        }
    }

    class MouseThing extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            int x = mainFrame.getX();
            int y = mainFrame.getY();
            fireballButton[fireballTotal] = new JLabel();
            ImageIcon label = new ImageIcon("C:\\Users\\Nick\\Documents\\NetBeansProjects\\ClickRPG2\\src\\clickrpg2\\Fireball.png");
            fireballButton[fireballTotal].setIcon(label);
            fireballButton[fireballTotal].setBounds(x, y, 64, 64);
            fireballTotal++;
            timer.start();
            if (fireballTotal > 900000) {
                fireballTotal = 0;
            }
        }
    }
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    // End of variables declaration
}

Basically, I just need it to not reset jLabel1 when I make a fireball jLabel.\

Any advice? Thanks in advance, I'm new here, so I hope the code blocks. Because I have no idea where the error is occuring, I needed to leave most of the code in. Sorry.

Iskar Jarak
  • 5,136
  • 4
  • 38
  • 60

1 Answers1

2

Well, there's your problem...

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);

Your container is under the control of a layout manager. Any attempt to change the position or size of any component (via setBounds, setLocation and/or setSize) will fail because the layout manager will discard those changes in favor of its own...

The moment you add or remove any component, the layout manager will update all the components to where it thinks they should be.

This won't work and as a bad idea.

while (true) {
    x = fireballButton[c].getX();
    y = fireballButton[c].getY();
    fireballButton[c].setBounds(x + 5, y, 64, 32);
    c++;
    if (c == fireballTotal) {
        break;
    }
}

Any time consuming or blocking actions (like a loop) will stop the EDT from updating the graphics, basically meaning that you won't actually see the fire ball...And I can't believe you used Timer with this (which would be in the right direction) and still used a loop...

My advice...

Use a JLayerPane instead. This allows you to use absolute positing instead (although you can apply a layout manager to it if you really want...but then it just be a JPanel)

Also, have a read through Concurrency in Swing

UPDATE with Example

enter image description here

public class TestFireBall {

    public static void main(String[] args) {
        new TestFireBall();
    }

    public TestFireBall() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new FireBallPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FireBallPane extends JLayeredPane {

        private JLabel character;
        private List<JLabel> fireBalls;
        private ImageIcon icoFireBall;
        private Timer timer;
        private Timer coolOffTimer;
        private int vX = 12;
        private boolean coolOff = false;

        public FireBallPane() {
            fireBalls = new ArrayList<JLabel>(25);

            ImageIcon icoCharacter = null;
            ImageIcon fireBall = null;

            try {
                icoCharacter = new ImageIcon(ImageIO.read(getClass().getResource("/BlackMage.png")));
                icoFireBall = new ImageIcon(ImageIO.read(getClass().getResource("/FireBall.png")));
            } catch (Exception e) {
                e.printStackTrace();
            }

            character = new JLabel(icoCharacter);

            add(character);

            setFocusable(true);
            requestFocusInWindow();

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "fire");
            ActionMap am = getActionMap();
            am.put("fire", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (!coolOff) {
                        coolOff = true;
                        JLabel fireBall = createFireBall();
                        fireBalls.add(fireBall);
                        if (!timer.isRunning()) {
                            timer.start();
                        }
                        coolOffTimer.restart();
                    }
                }
            });

            timer = new Timer(125, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (fireBalls.size() > 0) {
                        JLabel[] balls = fireBalls.toArray(new JLabel[fireBalls.size()]);
                        for (JLabel fireBall : balls) {
                            if (fireBall.getParent() == null) {
                                add(fireBall);
                            }
                            Point p = fireBall.getLocation();
                            p.x += vX;
                            if (p.x + fireBall.getWidth() >= getWidth()) {
                                remove(fireBall);
                                fireBalls.remove(fireBall);
                            } else {
                                fireBall.setLocation(p);
                            }
                            repaint();
                        }
                    } else {
                        timer.stop();
                    }
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);

            coolOffTimer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    coolOff = false;
                }
            });
            coolOffTimer.setRepeats(false);
            coolOffTimer.setCoalesce(true);
        }

        protected JLabel createFireBall() {
            JLabel fireBall = new JLabel(icoFireBall);

            fireBall.setSize(fireBall.getPreferredSize());
            int x = character.getX() + character.getWidth();
            int y = character.getY() + ((character.getHeight() - fireBall.getHeight()) / 2);
            fireBall.setLocation(x, y);

            return fireBall;
        }

        @Override
        public void invalidate() {
            super.invalidate();

            character.setSize(character.getPreferredSize());
            int height = getHeight();
            int y = (height - character.getHeight()) / 2;
            character.setLocation(0, y);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }
}
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
  • Hrm, I'm not sure how to use one of those. I can't seem to edit the code in the editors fold. I am using NetBeans premade JFrame if that helps. – Nick Martino Nov 01 '12 at 02:27
  • Change the `JFrame`'s layout to `BorderLayout`, go to the palette, in `Swing Containers` drag the `Layered Pane` onto the frame. – MadProgrammer Nov 01 '12 at 02:44
  • Epic, thanks! It worked flawlessly. I'm going to put a bit of time into looking at the code you put above tommorow, when I'm more awake. There's a bunch of stuff in there I havn't gotten to yet. – Nick Martino Nov 01 '12 at 03:03