2015-11-25 62 views
1

我有一个视觉类Gameboard由一个框架,代表'董事会'。这个想法是,当点击一个按钮时,板上的播放器将会移动,所以点击按钮时,板必须刷新。这是框架:JFrame不刷新与重绘

public Gameboard(Game game, int size, ArrayList<Enemy> e, Ogre o){ 

    this.ogre = o.getPosition(); 
    if(this.enemies.isEmpty() == false){ 
     this.enemies.clear(); 
    } 
    if(e.isEmpty() == false){ 
     for(Enemy en : e){ 
      this.enemies.add(en.getPosition()); 
     } 
    } 
    this.game = game; 

    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      } 

      JFrame frame = new JFrame("Swamp Escape!"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 
      frame.add(new GridPane(size)); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
      frame.setResizable(false); 

     } 
    }); 
} 

public class GridPane extends JPanel { 

    public GridPane(int size) { 

     setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     for (int row = 0; row < size; row++) { 
      for (int col = 0; col < size; col++) { 
       gbc.gridx = col; 
       gbc.gridy = row; 

       if(col == ogre.getX() && row == ogre.getY()) { 
        OgrePane ogre = new OgrePane(); 
        Border border = null; 
        if (row < size - 1) { 
         if (col < size - 1) { 
          border = new MatteBorder(1, 1, 0, 0, Color.GRAY); 
         } else { 
          border = new MatteBorder(1, 1, 0, 1, Color.GRAY); 
         } 
        } else { 
         if (col < size - 1) { 
          border = new MatteBorder(1, 1, 1, 0, Color.GRAY); 
         } else { 
          border = new MatteBorder(1, 1, 1, 1, Color.GRAY); 
         } 
        } 
        ogre.setBorder(border); 
        add(ogre, gbc); 
       } else { 
        CellPane cellPane = new CellPane(); 
        Border border = null; 
        if (row < size - 1) { 
         if (col < size - 1) { 
          border = new MatteBorder(1, 1, 0, 0, Color.GRAY); 
         } else { 
          border = new MatteBorder(1, 1, 0, 1, Color.GRAY); 
         } 
        } else { 
         if (col < size - 1) { 
          border = new MatteBorder(1, 1, 1, 0, Color.GRAY); 
         } else { 
          border = new MatteBorder(1, 1, 1, 1, Color.GRAY); 
         } 
        } 
        cellPane.setBorder(border); 
        add(cellPane, gbc); 
       } 

      } 
     } 

     JButton newGame = new JButton("New Game"); 
     newGame.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       game.newGame(); 
       ogre = game.getHek().getPosition(); 
       if(enemies != null) enemies.clear(); 
       for(Enemy en : game.enemies){ 
        enemies.add(en.getPosition()); 
       } 
       revalidate(); 
       repaint(); 
      } 
     }); 
     gbc.gridx = 0; 
     gbc.gridy = size + 1; 
     add(newGame, gbc); 

     JButton move = new JButton("Next Move"); 
     move.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       game.nextMove(); 
      } 
     }); 
     gbc.gridx = 1; 
     gbc.gridy = size + 1; 
     add(move, gbc); 

     JButton undo = new JButton("Undo"); 
     gbc.gridx = 2; 
     gbc.gridy = size + 1; 
     add(undo, gbc); 

     JButton diet = new JButton("Change Diet"); 
     gbc.gridx = 3; 
     gbc.gridy = size + 1; 
     add(diet, gbc); 
    } 
} 

newGame方法工作正常,但是当按钮尝试重新绘制框架没有任何反应。具体是new Game按钮。

该框架由一个网格组成,每个网格用三种类型的单元格填充,每个单元格扩展jpanel类。

重绘在JButton“新游戏”中被调用。单元格以循环方式添加。

欢迎任何帮助!

+0

它很难遵循你的代码,它似乎没有我们可以复制和过去它(测试它),但我不认为你有重绘问题,尝试重新调整框架的大小,如果你有改变,是的,重新绘制,如果没有,你可能没有正确添加组件...参考问题... –

回答

0

而不是简单地从JPanel级调用invalidate()repaint()级,请从JFrame级调用它们。像这样:

JButton newGame = new JButton("New Game"); 
    newGame.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      game.newGame(); 
      ogre = game.getHek().getPosition(); 
      if(enemies != null) enemies.clear(); 

      for(Enemy en : game.enemies){ 
       enemies.add(en.getPosition()); 
      } 

      JFrame frame = (JFrame) getRootPane().getParent(); 
      frame.pack(); 
     } 
    }); 
+0

对不起,不知道如果我理解正确:你说它应该工作,如果我打电话repaint()在JFrame初始化的级别上?我如何才能做到这一点,只有当按钮被按下?在我的代码中究竟会去哪里? –

+0

@JackMoulson我编辑了答案,以适应您的项目。希望这会帮助你解决你的问题。 – malinator

+0

谢谢!不幸的是,这并没有解决问题:( –

0

如果任何人有类似的问题,这是我如何固定它:

而不是重新油漆的JFrame,我只是设置在当前帧,并创建了一个新的包含更新的位置。它有点像'Gaffer-tape'修复,但它的工作方式是我想要的。

+0

这真的是一个'Gaffer磁带'修复我猜你有一些参考问题,以及... –

+0

我试图创建一个类似于你的环境来测试代码,事实上,我的第一个答案没有帮助,所以我决定重新包装'JFrame',它比从头开始创建一个新的'JFrame'要快得多,但要快得多,请查看我对答案所做的修改。 – malinator