2015-04-06 56 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); 


        }     

       } 
      }       
    } 
} 

和這裏的主類
import 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

那麼,什麼是錯我的代碼?爲什麼paintComponentCaseBlancheCaseNoire的行爲不如預期?
請幫

+0

你錯過了super.paintComponent(g);在CaseNoire首發。 – notanormie

+0

我添加了它,但仍然不能正常工作 –

+1

請參閱[製作強大的可調整大小的Swing Chess GUI](http://stackoverflow.com/q/21142686/418556)獲取提示。 –

回答

2
public void paintComponents(Graphics g) 

你有一個錯字。去掉paintComponents()中的"s"

setSize(800, 600); 

如您所願,因爲(880,600)包括標題欄和邊框,所以一些廣場將無法正確塗這將無法正常工作。

因此,您的自定義繪畫類應該重寫getPreferredSize()方法以返回每個組件的大小。然後你可以使用pack()方法來確保組件大小合適。

不需要CaseNoir和CaseBlanche類。當您創建的案例對象,你可以只使用:

setBackground(Color.BLACK); 

然後當你畫你只需要使用組件:

g.setColor(getBackground()); 

此外,您高原類是錯誤的。 paintComponent()方法用於繪畫。您的代碼正在創建和添加組件組件。如果你想添加組件,那麼你應該使用佈局管理器。只要getPreferredSize()方法已經實現,GridLayout將很容易在網格中添加組件。創建具有指定寬度/高度的組件,所以實現這個方法你做這樣的事情:

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

看看這個Chessboard Example一種方式在網格中添加組件。

+0

我刪除它,但仍然無法正常工作 –

+0

那我該怎麼做呢?這個問題不是在一些方塊的問題是所有的方塊 –

+0

@ 200L.B,看到很多的編輯。 – camickr