2017-04-26 80 views
0

我试图让图像图标ballpos在我的JButton数组中的两个JButton之间移动。这些按钮是每按一次JButton jBAct时的按钮99和108,因此在每次按jBAct时,图像将移动一个到99,然后一旦达到99将会上升到108,然后再次回到99,等等。让jButton ImageIcon在数组中的2个jButton之间移动

这是我试过的,我知道这是错误的,但我认为这是沿着这些线。

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

“*我知道这是错误的*”如何?描述为什么你的代码行为不是你想要的。 – user1803551

+0

图标位于100的起始位置。当按下jBAct时,它将向下移动到99,当它按下时它将上升到100.再次按下它时,它会下降到99等等。 – Callum

+0

没错,所以这里要意识到的一点是,如果我告诉你目前图标是102,你不知道在下一次按下(103或101)时将它移动到哪里。这告诉你必须记住它应该移动的方向,对吗? – user1803551

回答

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每个按钮或如我上面做共享相同的行为组按钮。它允许你将封装成这个按钮的行为。没有框架实现“全局”ActionListener,然后通过if-else语句查找事件的来源。这导致混乱和更多的错误。

actionPerformed里面的代码可以稍微精明一些,但是我为这个例子读了可读性。如果你了解它,你可以用许多不同的方式改变它。

最后,不要每次都创建一个新的图像图标。创建一次图像并存储,就像我为我的字符串所做的一样(对于字符串来说,这是一个冗余,因为String是特殊的)。您也可以使用null而不是空白图像,就像我为字符串大小写所做的那样。