2010-04-16 62 views
0

我是新来的java,我必须在周日前完成一个学校项目,并且遇到问题。Swing button repaint issue

下面的代码:

private abstract class GamePanel { 
    JPanel panel = null; 
} 

private class PutPanel extends GamePanel { 

    JButton putShip1 = new JButton(""); 
    JButton putShip2 = new JButton(""); 
    JButton putShip3 = new JButton(""); 
    JButton putShip4 = new JButton(""); 

    ShipDirection ship1Direction = ShipDirection.NORTH; 
    ShipDirection ship2Direction = ShipDirection.NORTH; 
    ShipDirection ship3Direction = ShipDirection.NORTH; 
    ShipDirection ship4Direction = ShipDirection.NORTH; 



    JButton startButton = new JButton("Start game"); 

    public PutPanel(){ 
     this.panel = new JPanel(); 
     panel.setSize(200, Torpedo.session.map.size*Field.buttonSize+300); 

     panel.setBackground(Color.blue); 

     putShip1.setSize(90, 90); 
     putShip1.setLocation(55, 5); 
     putShip1.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship1/full_north.png", null)); 

     putShip2.setSize(90, 90); 
     putShip2.setLocation(55, 105); 
     putShip2.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship2/full_north.png", null)); 

     putShip3.setSize(90, 90); 
     putShip3.setLocation(55, 205); 
     putShip3.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship3/full_north.png", null)); 

     putShip4.setSize(90, 90); 
     putShip4.setLocation(55, 305); 
     putShip4.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship4/full_north.png", null)); 

     startButton.setSize(150, 30); 
     startButton.setLocation(20, Torpedo.session.map.size*Field.buttonSize+205); 

     panel.add(putShip1); 
     panel.add(putShip2); 
     panel.add(putShip3); 
     panel.add(putShip4); 
     panel.add(startButton); 

     startButton.addActionListener(startButton()); 
     startButton.addActionListener(putShip1()); 
     startButton.addActionListener(putShip2()); 
     startButton.addActionListener(putShip3()); 
     startButton.addActionListener(putShip4()); 

     panel.setLayout(null); 
     panel.setVisible(true); 
    } 

    private ActionListener startButton(){ 
     return new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       putPanel.panel.setVisible(false); 
       actionPanel.panel.setVisible(true); 
      } 
     }; 

    } 

    private ActionListener putShip1(){ 
     return new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       selectedShip = 1; 
       putShip1.setBackground(Color.red); 
       putShip2.setBackground(null); 
       putShip3.setBackground(null); 
       putShip4.setBackground(null); 
       switch(ship1Direction){ 
        case NORTH: ship1Direction = ShipDirection.EAST; 
           putShip1.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship1/full_east.png", null)); 
           break; 
        case EAST: ship1Direction = ShipDirection.SOUTH; 
           putShip1.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship1/full_south.png", null)); 
           break; 
        case SOUTH: ship1Direction = ShipDirection.WEST; 
           putShip1.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship1/full_west.png", null)); 
           break; 
        case WEST: ship1Direction = ShipDirection.NORTH; 
           putShip1.setIcon(createImageIcon(Torpedo.session.map.shipPath+"/ship1/full_north.png", null)); 
           break; 
       } 
       putShip1.repaint(); 
       putShip2.repaint(); 
       putShip3.repaint(); 
       putShip4.repaint(); 
       panel.repaint(); 
       JOptionPane.showMessageDialog(new JFrame(), "Repaint finished", "Repaint status info", JOptionPane.INFORMATION_MESSAGE); //this here hangs the program when the method is finally called 
      } 
     }; 

当点击putShip之一*按钮,它就会以自己的图标右侧90°(意味着它改变为下一图像),但它什么也不做,直到单击startButton,将面板更改为另一个面板。 (只有第一个按钮的actionListener在这里,其他人的几乎是一样的)。该面板位于JFrame中,其他两个面板仍然没有任何作用。

我怎么能使其正常工作?

谢谢。

+7

那是因为你没有监听器添加到除startButton – 2010-04-16 01:48:58

+0

Ohshit其他按钮:d 它必须是真的已晚... 感谢:P – 2010-04-16 02:06:58

+3

@Chuk李你应该把它作为答案,以便它可以被接受。 – MatrixFrog 2010-04-16 04:58:58

回答

1

至于说用户竹园李加ActionListener S到putShip*按钮了。继承人的代码一点点为你​​增添:

startButton.addActionListener(startButton()); 
    startButton.addActionListener(putShip1()); 
    startButton.addActionListener(putShip2()); 
    startButton.addActionListener(putShip3()); 
    startButton.addActionListener(putShip4()); 

    putShip1.addActionListener(putShip1()); 
    putShip2.addActionListener(putShip2()); 
    putShip3.addActionListener(putShip3()); 
    putShip3.addActionListener(putShip3()); 

    panel.setLayout(null); 
    panel.setVisible(true);