使jButton ImageIcon在数组中的2个jButtons之间移动

时间:2017-04-26 17:11:49

标签: java arrays

我正在尝试使ballpos的图片图标在我的JButton数组中的两个JButton之间移动。这些是每次按下JButton jBAct时按钮99和108,因此每次按下jBAct时,图像会将一个向下移动到99,然后一旦达到99将向上移动到108然后再向下移动再到99等等。

这是我尝试过的,我知道这是错的,但我认为这是沿着这些方向发展的。

if (event.getSource() == jBAct)
{
    if (ballpos > 99)
    {
        jBGame[ballpos-1].setIcon(new ImageIcon("src/ball.png"));
        jBGame[ballpos].setIcon(new ImageIcon());
        ballpos--;
    } else {
        if (ballpos < 108){
            jBGame[ballpos+1].setIcon(new ImageIcon("src/ball.png"));
            jBGame[ballpos].setIcon(new ImageIcon());
            ballpos++;
        }
    }
}

此代码段位于课程public class CBabyBallBounce extends JFrame implements ActionListener中 和方法的一部分public void actionPerformed(ActionEvent event)

1 个答案:

答案 0 :(得分:0)

球移动的方向不会保留在代码中的任何位置,因此当球到达99到108之间的位置时,您无法知道移动它的方向。我建议将此信息保存在导致此行为的ActionListener中。

在下面的例子中,我有一个4个按钮的数组,球在这两个按钮之间移动。我用String表示球,但图像的概念是相同的。

public class Buttons {

    JButton[] buttons = new JButton[4];
    JButton move = new JButton("Move");

    private final String text = "O";

    Buttons() {
        JPanel panel = new JPanel();
        for (int i = 0; i < buttons.length; i++)
            panel.add(buttons[i] = new JButton());
        buttons[2].setText(text);

        move.addActionListener(new ActionListener() {

            private int ballpos = 2;
            private int dir = 1;

            @Override
            public void actionPerformed(ActionEvent e) {
                buttons[ballpos].setText(null);
                ballpos += dir;
                buttons[ballpos].setText(text);
                if (ballpos == buttons.length - 1)
                    dir = -1;
                else if (ballpos == 0)
                    dir = 1;
            }
        });

        JFrame frame = new JFrame();
        frame.getContentPane().add(panel);
        frame.add(move, BorderLayout.PAGE_START);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Buttons());
    }
}

我强烈建议每个按钮或按钮组添加ActionListener,这些按钮与我上面的行为相同。它允许您封装按钮的行为。没有框架实现&#34;全球&#34; ActionListener然后通过if-else语句找到事件的来源。这会导致混乱和更多错误。

actionPerformed内的代码可能稍微聪明一点,但我为这个例子寻求可读性。如果您了解它,您可以通过多种不同方式进行更改。

最后请注意,不要每次都创建新的图片图标。对图像进行一次打包并将其存储为我对字符串的处理(对于字符串,这是多余的,因为String是特殊的)。你也可以使用null而不是空图像,就像我对字符串一样。