【问题标题】:Jbutton event handler not working properlyJbutton 事件处理程序无法正常工作
【发布时间】:2013-03-25 13:59:34
【问题描述】:
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();
            }
    }
});

谁能解释为什么掷骰子的 actionListener 中的 for 循环似乎不起作用,而它上面的 for 循环却完全一样起作用?没有实际错误,因为它什么都不做,但它确实进入了 actionListener 并在我们将打印语句等放入其中时执行。

猜测 actionListeners 有点奇怪,但我不确定是什么。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你有没有在for循环之前打印actionPerformed中的getNumOfPlayers()
  • @skirsch 修复缩进很好,但改变编码风格被认为是过于激进的改变。批准您的修改的人应该知道这一点...
  • @Lundin 好的,我再试一次;)
  • @VishalK 我打印了 getNumOfPlayers 它总是一样的,这与它无关。由于某种原因,似乎只是没有在 for 循环中执行任何操作。
  • 您是否将System.out.print 放入for 循环中?那是打印什么东西吗?

标签: java swing scope jbutton


【解决方案1】:

您应该在for loop 之后调用validate(),如下所示:

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

例如考虑下面给出的代码:

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();
            }
        });
    }
}

注意:注释代码validate(),然后编译执行看看效果。

【讨论】:

  • 这并没有什么不同,即使该行不在 for 循环中,尽管在 addActionListener 方法上方正常工作(有或没有 for 循环),它仍然什么都不做。对于为什么它不起作用完全没有意义。它唯一不起作用的地方是该方法内部,而这正是它需要的地方。
  • 你试过这个解决方案了吗?在您添加了currentPlayersOnTile[5] PanelJFrame 上调用validate
  • 是的,我试过了。它完全没有做任何事情。 currentPlayersOnTile[5].add(players[i].getPlayerIcon()); 这行没有问题。上面使用该确切行(仅将 5 或 i 更改为其他值)将图标放在 currentPlayersOnTile[0] 的第一个图块上,因此它在此按钮事件处理程序中存在问题。
  • 我对代码进行了一些编辑。希望它更有意义。
  • 你应该revalidate()改变的面板,而不是整个框架。
猜你喜欢
  • 2014-07-27
  • 2019-06-06
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多