2012-08-29 152 views
4

問題是當我將square JPanel的背景顏色設置爲square.setBackground(colors [j])時,方塊僅繪製顏色列表的第一個顏色而不顯示另一個3.這是我的代碼:JPanel如何顯示顏色數組中的不同顏色?

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import java.awt.*; 

@SuppressWarnings({ "unused", "serial" }) 

public class RegionPartition extends JFrame 
{ 
    JLayeredPane layeredPane; 
    JPanel regionBoard; 
    JLabel regionPiece; 

    private static int DELAY = 200; 

    private Color[] colors = new Color[]{Color.PINK, Color.GREEN, Color.BLACK, Color.RED}; 

    public RegionPartition() 
    { 
     Dimension boardSize = new Dimension(500, 500); 

     // Use a Layered Pane for this this application 
     layeredPane = new JLayeredPane(); 
     getContentPane().add(layeredPane); 
     layeredPane.setPreferredSize(boardSize); 

     regionBoard = new JPanel(); 

     layeredPane.add(regionBoard, JLayeredPane.DEFAULT_LAYER); 

     regionBoard.setLayout(new GridLayout(4, 4)); 

     regionBoard.setPreferredSize(boardSize); 
     regionBoard.setBounds(0, 0, boardSize.width, boardSize.height); 

     Random random = new Random(); 


     for (int i = 0; i < 16; i++) {   
      JPanel square = new JPanel(new BorderLayout()); 
      square.setBorder(BorderFactory.createLineBorder(Color.black)); 
      regionBoard.add(square); 

      square.setBackground(Color.green); 

      int j=0; 

      square.setBackground(colors[j]); 

      j++; 
     } 
    } 

    { 
     JPanel panel = new JPanel() 
     { 
      Clients[] c = new Clients[128]; 

      Random random = new Random(); 

      private final int SIZE = 450; 
      private int DELAY = 9999999; 
      public void paintComponent (Graphics g) 
      { 
       super.paintComponent(g); 

       for (int i=0; i<c.length; i++) 
       { 
        int x = (int) (random.nextFloat() * SIZE) + 10; 
        int y = (int) (random.nextFloat() * SIZE) + 10; 

        g.drawOval(x, y, 10, 10); 
        g.fillOval(x, y, 10, 10); 
       } 

       for (int j=0; j<DELAY; j++) 
       { 
        repaint(); 
       } 
      } 
     }; 

     panel.setOpaque(false); 

     //Set the glass pane in the JFrame 
     setGlassPane(panel); 

     //Display the panel 

     panel.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     JFrame frame = new RegionPartition(); 

     frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

    protected void paintComponent(Graphics g) 
    { 
     // TODO Auto-generated method stub 
    } 
} 
+3

每行之間的額外間距不利於可讀性,縮進呢!在設置顏色之前,j始終設置爲0 ... –

+1

btw:您不應該在paintComponent()方法內調用repaint()(這會導致您的組件被反覆繪製)。而且,多次調用repaint()(你用循環調用它200次)是沒有用的,因爲它們被合併爲一次調用。 –

回答

5

那是因爲你總是在每次迭代設置J即可0:

int j=0; 

    square.setBackground(colors[j]); 

    j++; 

你可能想改變j表示的我還是一個嵌套的循環,這取決於你真正想做的事這裏。

如果你想使所有16個正方形有喜歡的方式網格中的所有四種顏色,你可能希望你的循環更改爲類似:

 for (int i = 0; i < 16; i++) {   
     JPanel square = new JPanel(new GridLayout(2,2)); 
     square.setBorder(BorderFactory.createLineBorder(Color.black)); 
     regionBoard.add(square); 



     for(int j=0; j<4; ++j){ 
      JPanel insideSquare = new JPanel(); 
      insideSquare.setBackground(colors[j]); 
      square.add(insideSquare); 
     } 
    } 
+0

我想更改JPanel正方形的背景顏色。即使當我使用for循環時,它也只繪製Color數組中的一種顏色,在這種情況下它只繪製數組的最後一種顏色!你的意思是把它改成我? – user1633202

+1

@ user1633202「它只繪製數組Color中的一種顏色,在這種情況下它只繪製最後一種顏色」這是因爲JPanel只能有一種背景顏色,每次都覆蓋它。 –

+1

您還應該使用模('%')運算符,因爲數組中只有4種顏色,但循環重複了16次 –

3

你是你的爲範圍內的實例int j循環,所以它的值不會在多次迭代中保留。您應該在您的代碼中的某個位置聲明它,以允許它覆蓋整個for循環。

int j = 0; 
<for loop> 
    square.setBackground(colors[j]); 
    j++; 
<end for> 

但是,你j在這種情況下,其中i足以作爲數組索引服務的i目的。這將是更正確的完全刪除j,而是做到以下幾點:

square.setBackground(colors[i]); 
+0

我按照你的建議,但我有編譯錯誤:線程「主」java.lang.ArrayIndexOutOfBoundsException異常:4 \t在RegionPartition。 (RegionPartition.java:55) \t at RegionPartition.main(RegionPartition.java:109) – user1633202

+0

這是一個運行時錯誤,而不是語法錯誤。無論如何,如果你正確實施了'int j',那麼就會發生這種情況,所以我必須確定你的目標是什麼顏色。 – Vulcan

4

因爲你只能有4種顏色在你color數組,但你的循環指數超過這一點,你可以使用:

square.setBackground(colors[ i % colors.length]); 

交替你的方塊的顏色。