简体   繁体   中英

Jbutton event handler not working properly

rollDice.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        //generate roll
            int roll = dice.getRoll();

            addGameFeedMessage(players[1].getName() + " rolled " + roll);

            //store the player's position before the roll
            int currentPlayerPos = players[1].getPosition();

            //update player's position
            players[1].movePlayer(roll);

            //move the player icon to the player's position
            tiles[players[1].getPosition()].addIconCurrentPlayersPanel(players[1].getPlayerIcon());

            //revalidate components
            //tiles[currentPlayerPos].getCurrentPlayersPanel().revalidate();
            //tiles[players[1].getPosition()].getCurrentPlayersPanel().revalidate();
            //this loop was put in to see if doing revalidate() on all panels would make a difference but the problem is still there
            for(int i = 0; i < tiles.length; i++)
            {
                tiles[i].getCurrentPlayersPanel().revalidate();
            }
    }
});

Can anyone explain why the for loop in the actionListener for roll dice doesn't seem to work yet the for loop just above it which is the exact same thing works? There's no actual error as such it just doesn't do anything, however it does get inside the actionListener and executes as we've put print statements etc in it.

Guessing its something strange about actionListeners but I'm not sure what.

Any assistance would be appreciated, thankyou.

You should call validate() after the for loop as follows:

for(int i = 0; i < getNumOfPlayers(); i++)
{
    currentPlayersOnTile[5].add(players[i].getPlayerIcon());
}
validate();

For Example consider the code given below:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class DemoPanels extends JFrame
{
    public void createAndShowGUI()
    {
        final JPanel panel = new JPanel();
        getContentPane().add(panel);
        JButton button = new JButton("Click");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
                for (int i = 0 ; i < 10 ; i++ )
                {
                    JPanel panel1 = new JPanel();
                    panel1.add(new JButton(String.valueOf(i)));
                    panel.add(panel1);
                }
                validate();//comment this line and then compile and execute the code to see the effect
            }
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
        setSize(300,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                DemoPanels dp = new DemoPanels();
                dp.createAndShowGUI();
            }
        });
    }
}

NOTE: comment the code validate() and then compile and execute it to see the effect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM