2015-04-19 2 views
0

У меня есть проблема живописи JComponentВыпуск в живописи JComponents добавлен в JComponent

// класс, где прямоугольник должен нарисовали

public class Board extends JComponent 
{ 
    private Case[][] cases= new Case[10][10]; 

    public Plateau() { 
     super(); 
     this.setLayout(new GridLayout(10,10)); 
     this.setSize(getPreferredSize()); 

     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 
       if ((i + j) % 2 == 0) { 

        cases[i][j] = new WhiteCase(j * Case.LONGUEUR, i * Case.LONGUEUR, Case.LONGUEUR, Case.LONGUEUR); 
       } else { 
        cases[i][j] = new BlackCase(j * Case.LONGUEUR, i * Case.LONGUEUR, Case.LONGUEUR, Case.LONGUEUR); 

       }       
       add(cases[i][j]); 
      } 
     } 
     repaint(); 

    } 
    public Dimension getPreferredSize() { 
      return new Dimension(600, 600); 
     } 
} 

// Базовый класс для прямоугольника

public abstract class Case extends JComponent { 


    protected static final int LONGUEUR=60; 

    protected int x,y,width,height;     
    protected abstract void paintComponent(Graphics g); 
    public Dimension getPreferredSize() {    return new Dimension(LONGUEUR, LONGUEUR); 
     } 
} 

///черный Корпус

public class BlackCase extends Case 
{ 

    private Piece piece; 
    private static final long serialVersionUID = 1L; 
    public CaseNoire(int x, int y,int width,int height) 
    { 

     this.x=x; 
     this.y=y; 
     this.width = width; 
     this.height= height; 
    } 
    public Dimension getPreferredSize() { 
      return new Dimension(LONGUEUR, LONGUEUR); 
     } 
@Override 
protected void paintComponent(Graphics g) 
{ 

    g.setColor(Color.darkGray);  
    g.fillRect(x, y,width,height);     
} 
} 


public class CaseWhite extends Case { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public CaseBlanche(int x, int y,int width,int height) 
    { 

     this.x=x; 
     this.y=y; 
     this.width = width; 
     this.height= height; 


    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 

     g.setColor(Color.white);  
     g.fillRect(x, y,width,height); 
     g.setColor(Color.BLACK); 
     g.drawString("X= "+x , 10, 10); 
    } 
    public Dimension getPreferredSize() { 
      return new Dimension(LONGUEUR, LONGUEUR); 
     } 

} 

//Main class 
public class CheckersGame extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) 
    { 
    CheckersGame checkers= new CheckersGame(); 
    } 
    public CheckersGame()  
    { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Jeu de Dames");      
     JPanel panelPrincipalDame = new JPanel(new GridBagLayout()); 

     Board board = new Board(); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.fill= GridBagConstraints.NONE; 
     c.gridx =0; 
     c.gridy = 0 ; 
     c.gridheight= 2; 
     c.gridwidth= 2; 

     panelPrincipalDame.add(plateau,c); 
    setSize(800, 700); 
     setContentPane(panelPrincipalDame);  

     ![//setVisible(true);][1] 
     setResizable(false);   
    }  
} 

Результатом этого кода (Примечание X + 0 и т.д .. только для отладки цели) enter image description here

Но то, что я хочу это enter image description here

Пожалуйста, почему я получаю только один прямоугольник?

+0

Для лучшей помощи раньше, опубликовать [MCVE] (http://stackoverflow.com/help/mcve) (Минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (короткий, самосохраненный, правильный пример). –

ответ

4

Так много для прослушивания моего предложения НЕ создавать классы «CaseNoire» и «CaseBlanch», которые я дал в вашем последнем вопросе: paintComponent does not paint correctly две недели назад. Эти классы не нужны. Что произойдет, если вы когда-либо захотите предоставить пользователю гибкость в выборе цветов квадратов. Ваша логика игры никогда не должна основываться на имени класса или что-то в этом роде. Поэтому избавитесь от классов и используйте встроенные функции Swing для окраски фона компонента.

Я думаю, проблема заключается в том, что вы создали переменные «x, y, width, height» в классе Case. Я считаю, что эти переменные уже определены в классе Component, чтобы представить размер/расположение компонента.

Избавьтесь от переменных, вам не нужно управлять размером и расположением каждого компонента, потому что GridLayout сделает это за вас.

Снова посмотрим на пример кода, который я вам дал, который показывает, как создать «ChessBoard».

+0

Создание CaseBlanche и CaseNoire только для иллюстрации принципа полиморфизма, и нам это нужно –

+0

И что случилось, когда вы внедрили мое предложение, чтобы избавиться от всех переменных экземпляра? – camickr

+0

Я следил за твоим предложением и избавился от x y, но не решил проблему. для вашего вопроса я сделаю что-то, что противоречит спецификациям школьного проекта –

0

Я решил это я просто установить X = 0 и Y = 0 в paintComponent()

protected void paintComponent(Graphics g) 
{ 

    g.setColor(Color.darkGray);  
    g.fillRect(0, 0,width,height);    
} 
+1

, и ваше решение состоит в том, чтобы игнорировать переменные x/y, поэтому они НЕ должны быть определены в вашем классе. Вы не используете их, поэтому избавляйтесь от них. – camickr

+0

Я использую их, так как я должен вернуть случай на основе номера столбца и строки –

+1

. Вы НЕ должны создавать переменные x, y, width, height, как я уже упоминал. Они являются переменными, определяемыми кластером Component, и используются для определения размера и местоположения компонента менеджером компоновки. Если вы хотите знать, какой компонент находится в номере строки/столбца, вы можете использовать метод getLocation(), который вернет объект Point, задающий значения x/y. Затем вы можете использовать метод getSize(), который возвращает объект Dimension для значений width/height. – camickr