2016-06-24 2 views
0

Я рисую шахматную доску в Swing. Я создал плитки (jpanel), а затем попытался добавить компоненты на доску (другой jpanel). Каждый раз, когда добавляется плитка, я пытаюсь установить цвет, черный или белый. У Совета есть GridLayout. Совет добавляет к нему 64 плитки, но только одна из плиток получает цвет, а остальные - по умолчанию. Я попытался сменить плитки (jpanel) на кнопки (JButton) (чтобы увидеть, добавлены ли компоненты на доску или нет), и программа добавила 64 кнопки в Совет. Итак, я предполагаю, что в компоновке и добавлении компонентов нет проблем, а что-то делать с обновлением цвета?Цветные элементы JPanel, которые находятся внутри JPanel

Итак, как я могу изменить цвет этих меньших jpanels (плитки), когда я добавляю их в большую Jpanel (Board)?

Программа выглядит следующим образом (не возражаете схему окраски, я на самом деле не хотят шахматную доску):

class Tile extends JPanel{ 

     private final int width = 50; 
     private final int height = 50; 
     Color tileColor; 
     int xPos, yPos; 


     public Tile(int xPos, int yPos, Color tileColor){ 

      this.xPos = xPos; 
      this.yPos = yPos; 
      this.tileColor = tileColor; 

     } 
     public Dimension getPreferredSize(){ 
      return new Dimension(width, height); 
     } 

     protected void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(tileColor); 
      g.fillRect(xPos, yPos, getWidth(), getHeight()); 

     } 

    } 

    class Board extends JPanel{ 

     private final int width = 400; 
     private final int height = 400; 

     private int numTiles = 8; 
     private final Color black = Color.BLACK; 
     private final Color white = Color.WHITE; 

     private final int hGap = 2; 
     private final int vGap = 2; 


     public Board(){ 

      setLayout(new GridLayout(numTiles, numTiles,hGap, vGap)); 
      setBackground(Color.CYAN); 

      Color tileColor; 
      int yPos = 0; 
      for(int i = 0; i < numTiles; i++){ 

       int xPos = 0; 
       for(int j = 0; j < numTiles; j++){ 
        if(j % 2 == 0) 
         tileColor = black; 
        else 
         tileColor = white; 


        add(new Tile(xPos, yPos, tileColor)); 
        xPos += 50; 
       } 
       yPos += 50; 
      } 
     } 



     public Dimension getPreferredSize(){ 
      return new Dimension(width,height); 
     } 
    } 

ответ

2

Это неправильно:

g.fillRect(xPos, yPos, getWidth(), getHeight()); 

Вы заполнения цвет в порядке, но в xPos и ​​yPos относительно этого JPanel, что означает, что цвет находится далеко от фактического отображаемого региона JPanel.

Решения:

  • Изменить XPOS и YPos до 0 и 0
  • Или лучше просто позвонить setBackground(...) в конструкторе.
Смежные вопросы