2013-05-13 64 views
0

我不清楚如何在我現有的代碼中重新繪製一個JPanel。我也不知道如何調用paintComponent。首先,我只想清除JPanel,但我甚至無法做到這一點。重繪/重新驗證JPanel不會工作

我希望能夠按下「下一步移動」按鈕並重新繪製JPanel,給出我正在讀取顏色的網格變化。我無法通過調用,revalidate(),removeAll()和repaint()更改JPanel到我的tile JPanel。

我稱這些並沒有任何反應,以現有的JPanel下方的俄羅斯方塊格(磚)(圖)..

在下面的代碼中,我有一個繼承JPanel和設置功能嵌套類創建窗口採用二維陣列表格並構建原始網格。

如何至少明確JPanel的甚至更好的一個新的網格重繪......我在想一個方法:

public void redraw(Grid g) { 
     removeAll(); 
        getColor(); //gets new grid of tiles 
        repaint(); 
     revalidate(); 
    } 

內嵌套的JPanel類,但這似乎沒有改變的JPanel根本不清楚目前的圖紙。

Tetris Board reading in original grid

public class BoardGraphics { 

    public ArrayList<ArrayList<Color>> colours; 

    private final int width; 

    private int height; 

    private JFrame display; 

    private TetrisSquares tiles; 

    private Container c; 

    public BoardGraphics(int width, int height, 
     ArrayList<ArrayList<Integer>> grid) { 
     this.width = width; 
     this.height = height; 
     colours = new ArrayList<ArrayList<Color>>(width); 
     setColor(grid); 
     setup(); 
    } 

    public void setup() { 
     System.out.println("Let the Tetris Begin"); 
     display = new JFrame("Tetris Agent"); 



     final TextArea welcome = new TextArea("Welcome to Tetris", 2, 10, 
       TextArea.SCROLLBARS_NONE); 

     welcome.setBackground(Color.black); 
     welcome.setForeground(Color.red); 
     welcome.setFont(new Font("monospaced", 0, 11)); 
     welcome.setEditable(false); 

     Button btnStart = new Button("Next Move"); 
     btnStart.setFocusable(false); 



     tiles = new TetrisSquares(TetrisBoard.BOARD_WIDTH, height); 

     c = new Container(); 
     c.setLayout(new BorderLayout()); 
     c.add(welcome, BorderLayout.NORTH); 
     c.add(tiles); 
     c.add(btnStart,BorderLayout.SOUTH); 

     btnStart.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
      tiles.removeAll(); 
      tiles.revalidate(); 
      } 
     }); 


     final Container main = new Container(); 

     main.setLayout(new GridLayout(1, 2)); 
     display.add(c); 



     display.pack(); 

     display.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     display.setVisible(true); 
    } 

    public ArrayList<ArrayList<Color>> getBoard() { 
     return colours; 
    } 

    public void setColor(ArrayList<ArrayList<Integer>> grid) { 
     ListIterator<Integer> li; 

     for (int i = 0; i < width; i++) { 
      colours.add(new ArrayList<Color>()); 
      li = grid.get(i).listIterator(); 
      for (int j = 0; j <= height; j++) { 
       int n = 0; 
       if(li.hasNext()) { 
        n = li.next(); 

       } 
       switch (n) { 
       case 1: 
        colours.get(i).add(Color.red); 
        break; 
       case 2: 
        colours.get(i).add(Color.pink); 
        break; 
       case 3: 
        colours.get(i).add(Color.orange); 
        break; 
       case 4: 
        colours.get(i).add(Color.yellow); 
        break; 
       case 5: 
        colours.get(i).add(Color.green); 
        break; 
       case 6: 
        colours.get(i).add(Color.cyan); 
        break; 
       case 7: 
        colours.get(i).add(Color.blue); 
        break; 
       default: 
        colours.get(i).add(Color.gray); 
        break; 
       } 
      } 
     } 
    } 



    public class TetrisSquares extends JPanel { 

     public int width; 
     public int height; 

     public TetrisSquares(int width, int height) { 
      this.width = width; 
      this.height = width; 
      this.setPreferredSize(new Dimension(width * 20, height * 20)); 
     } 

     public void redraw() { 
      removeAll(); 
      //add your elements 
      //revalidate(); 
      //repaint(); 
     } 


     public void paintComponent(Graphics g) { 

      super.paintComponent(g); 

      Graphics2D graphics = (Graphics2D) g; 
      graphics.setColor(Color.BLACK); 
      /* 
      * tiles.width = getSize().width/width; tiles.height = 
      * getSize().height/800; 
      * 
      * insets.left = (getSize().width - width * tiles.width)/2; 
      * insets.right = insets.left; insets.top = 0; insets.bottom = 
      * getSize().height - height * tiles.height; 
      */ 
      Dimension size = getSize(); 
      Insets insets = getInsets(); 

      int w = size.width - insets.left - insets.right; 
      int h = size.height - insets.top - insets.bottom; 

      int tileWidth = w/width; 
      int tileHeight = w/width; 

      ListIterator<Color> li; 

      for (int i = 0; i < width; i++) { 
       li = colours.get(i).listIterator(); 
       int n = 20; 

       while(li.hasNext()) { 
        --n; 
        int x = (int) (i * tileWidth); 
        int y = (int) (n * tileHeight); 
        graphics.setColor(li.next()); 
        graphics.fillRect(x, y, tileWidth, tileHeight); 
        graphics.setColor(Color.black); 
        graphics.drawRect(x, y, tileWidth, tileHeight); 
       } 
      } 

     } 

    } 

} 
+1

填充爲了更好的幫助停止paintComponent方法更快,張貼[SSCCE(HTTP: //sscce.org/)。 – 2013-05-13 07:20:08

回答

3

開始由具有通過Painting in AWT and Swing讀,以便更好地理解繪畫體系。

removeAll從容器中刪除所有的子組件,這是不是真的會幫助你在這種情況下...

revalidate涉及佈局子系統和響應更新容器層次結構中的變化容器的內容,再次,真的沒有幫助...

在你的paintComponent方法,你引用一個ArrayListcolours,這是用來畫正方形。您需要重置此列表從顏色

redaw方法應該看起來更加像...

public void redraw() { 
    colours.clear(); 
    repaint(); 
}