2015-04-06 2 views
0

Я пытаюсь сделать игру в шашки, но следующая архитектура не показывает на JFrame, что я делаю неправильноpaintComponent не красит правильно

// базовый класс

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.*; 

public abstract class Case extends JComponent implements MouseListener { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    protected static final int LONGUEUR=40; 
    protected int x,y,width,height; 


    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 
} 

// черный прямоугольник

import java.awt.Color; 
import java.awt.Graphics; 


public class CaseNoire extends Case 
{ 
/** 
    * 
    */ 
    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; 
    } 

@Override 
protected void paintComponent(Graphics g) 
{ 
    g.setColor(Color.black);  
    g.fillRect(x, y,width,height); 
} 
} 

// белый прямоугольник

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 


public class CaseBlanche 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) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.white);  
     g.fillRect(x, y,width,height); 
    } 

} 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Paint; 

import javax.swing.JComponent; 
import javax.swing.JPanel; 

public class Plateau extends JComponent 
{ 
    private Case[][] cases= new Case[10][10]; 
    @Override 
    protected void paintComponent(Graphics g) { 
     // TODO Auto-generated method stub 
     super.paintComponent(g);     
      for(int i=0; i<10; i++) 
      { 
       for(int j=0;j<10;j++) 
       { 
        if((i+j)%2==0) 
        { 
         CaseBlanche blanche= new CaseBlanche(j*Case.LONGUEUR,i*Case.LONGUEUR,Case.LONGUEUR, Case.LONGUEUR); 
         //cases[i][j]=blanche; 
         add(blanche); 
         //g.setColor(Color.white);  
         // g.fillRect(j*40, i*40,40,40); 
        } 
        else 
        { 
         CaseNoire caseNoire=new CaseNoire(j*Case.LONGUEUR,i*Case.LONGUEUR,Case.LONGUEUR, Case.LONGUEUR); 
        add(caseNoire); 


        }     

       } 
      }       
    } 
} 

и здесь Основной класс
импорт javax.swing.JFrame;

public class MainDamesFrame extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) 
    { 
     MainDamesFrame damesFrame = new MainDamesFrame(); 


    } 
    public MainDamesFrame()  
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Jeu de Dames");       
     this.getContentPane().add(new Plateau());  
     setSize(800, 600); 
     setVisible(true);     

    } 

} 

Я ожидал что-то вроде этого

enter image description here

Так что же случилось с моим кодом? почему paintComponent в CaseBlanche и CaseNoire не ведет себя так, как ожидалось?
Пожалуйста, помогите

+0

Вам не хватает super.paintComponent (g); в CaseNoire для стартеров. – notanormie

+0

Я добавил его, но все еще не работает –

+1

См. Также [Создание надежного, масштабируемого графического интерфейса Swing Chess GUI] (http://stackoverflow.com/q/21142686/418556) для советов. –

ответ

2
public void paintComponents(Graphics g) 

У вас есть опечатка. Избавьтесь от "s" в paintComponents().

setSize(800, 600); 

Это не будет работать, как вы ожидали, потому что (880, 600), включали в себя строку заголовка и границ, поэтому некоторые из квадратов не будут окрашены правильно.

Итак, ваши классы рисования должны переопределить метод getPreferredSize(), чтобы вернуть размер каждого компонента. Затем вы можете использовать метод pack(), чтобы убедиться, что компоненты имеют нужный размер.

Нет необходимости в классах CaseNoir и CaseBlanche. При создании объекта Case вы можете просто использовать:

setBackground(Color.BLACK); 

Затем, когда вы рисуете компонент, который вы просто использовать:

g.setColor(getBackground()); 

Кроме того, ваш класс нагорье является неправильным. Метод paintComponent() предназначен для рисования. Ваш код создает и добавляет компоненты компонентов. Если вы хотите добавить компоненты, вы должны использовать диспетчер компоновки. GridLayout легко добавит компоненты в сетку до тех пор, пока будет реализован метод getPreferredSize(). Вы создаете компонент с заданной ширины/высоты, поэтому для реализации этого метода вы делаете что-то вроде:

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

Проверить это Chessboard Example способ добавить компоненты в сетке.

+0

Я удаляю его, но все еще не работает –

+0

Так что я должен делать точно?вопрос не с некоторыми квадратами, проблема связана со всеми квадратами –

+0

@ 200L.B, см. множество исправлений. – camickr

Смежные вопросы