2012-03-06 5 views
1

私は簡単なチェッカーゲームを作成するための少しプロジェクトを始めます。しかし、私はJavaのGUIツールを使用して以来、長い時間がかかりました。この時点でのコードの目的は、最初のボード(上部に赤い部分、下部に黒い部分)を描くことです。しかし、私がコードを実行するときに私が得るのは空白のフレームです。私の円描画コードが私が望むことを実行するかどうか(つまり、特定の四角内に赤または黒の実線を作成するかどうか)は少し不確定です。ここにコードがあります。Javaでチェッカーボードを作成する

EDIT:私は多分青と灰色の四角形を交互に描くべきでしょう。そうでなければ、おそらく巨大な青い塊になりますが、この時点では巨大な青い塊になるでしょう: p

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

public class CheckersServer 
{ 
    public static class Board 
    { 
     private JFrame frame = new JFrame(); 
     private JPanel backBoard = new JPanel(); 

    Board() 
    { 

     frame.setSize(905,905); 
     backBoard.setSize(900,900); 
     frame.setTitle("Checkers"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     backBoard.setVisible(true); 


     boardSquare bs; 
     String type = null; 
     //Filling in Red Side 
     for (int i = 0; i <=1; i++) 
     { 
      for(int j = 0; j < 9; j++) 
      { 
       if(j % 2 == 0) 
       { 
        type = "Red"; 
       } 
       else 
       { 
        type = "Blank"; 
       } 

       bs = new boardSquare(100*j,100*i,type); 
       backBoard.add(bs); 

      } 

     } 
     //Filling in empty middle 
     type = "Blank"; 
     for (int i = 2; i < 7; i++) 
     { 
      for(int j = 0; j < 9; j++) 
      { 

       bs = new boardSquare(100*j,100*i,type); 
       backBoard.add(bs); 

      } 

     } 

     //Filling in Black side 
     for (int i = 7; i < 9; i++) 
     { 
      for(int j = 0; j < 9; j++) 
      { 
       if(j % 2 != 0) 
       { 
        type = "Black"; 
       } 
       else 
       { 
        type = "Blank"; 
       } 

       bs = new boardSquare(100*j,100*i,type); 
       backBoard.add(bs); 

      } 

     } 

     backBoard.repaint(); 
     frame.add(backBoard); 
     frame.repaint(); 


    } 

    private class boardSquare extends JComponent 
    { 
     private int x; //x position of the rectangle measured from top left corner 
     private int y; //y position of the rectangle measured from top left corner 

     private boolean isBlack = false; 
     private boolean isRed = false; 

     public boardSquare(int p, int q, String type) 
     { 
      x = p; 
      y = q; 
      if (type.equals("Black")) 
      { 
       isBlack = true; 
       isRed = false; 
      } 
      else if (type.equals("Red")) 
      { 
       isRed = true; 
       isBlack = false; 
      } 
      else if (type.equals("Blank")) 
      { 
       isBlack = false; 
       isRed = false; 
      } 

     } 
     public void paintComponent(Graphics g) 
     { 
      Graphics2D g2 = (Graphics2D) g; 
      Rectangle box = new Rectangle(x,y,100,100); 
      g2.draw(box); 
      g2.setPaint(Color.BLUE); 
      g2.fill(box); 

      if(isBlack) 
      { 
       g2.fillOval(x, y,100 ,100); 
       g2.setColor(Color.black); 
       g2.drawOval(x, y, 100, 100); 
      } 

      else if(isRed) 
      { 
       g2.fillOval(x, y,100 ,100); 
       g2.setColor(Color.red); 
       g2.drawOval(x, y, 100, 100); 
      } 

     } 
    } 


} 


public static void main(String[] args) 
{ 
    Board game = new Board(); 

} 
} 
+0

ありがとうございました!はい、私は座標xとyが相対的にどのように測定されたのか誤解しました。 Gridlayoutは正しい方向への一歩と思われる。 –

+0

今すぐ動作します、ありがとう! –

+0

回答のうちの1つを正解としてマークすることができます。これにより、将来的に多くの質問に回答することができます。そして、それは良いSOのエチケットです。あなたのプログラムは今やうれしいです。 – Tony

答えて

3

いくつかの問題があります。

Java UIはレイアウトベースです。つまり、コンポーネントを親に追加すると、親のレイアウトによって子コンポーネントが配置される場所が決まります。レイアウトを設定するコードがないので、アプリケーションでデフォルトを使用しています(デフォルトはFlowLayoutで、これはJFrameと子が適切なサイズである限り、あなたのケースでは機能します)。

大きな問題はboardSquareクラスにあります。デフォルトでは、JPanelsのサイズは10x10です。あなたはサイズを指定していないので、すべての四角は10x10です。あなたはどのくらい大きいかを正方形に伝える必要があります。あなたはboardSquareコンストラクタでこれを行うことができます:最後に、あなたの描画コードでは、あなたは正方形と円を描くときのx、yのオフセットをやっている

setPreferredSize(new Dimension(100, 100)); 

。これは、コンポーネントの左上隅からのオフセットです。あなたのコンポーネント(サイズを設定した後)は100x100ピクセルになります。しかし、あなたのx、yがこれらの値より大きい場合は、コンポーネントの範囲外に描画されます。代わりに、これらの値は0,0に設定する必要があります。これは描画するコンポーネントの左上隅であるためです。

x、yを0に設定するだけで、それはかなりではありませんでしたが、フレームに四角形の描画を得ることができます。正しいレイアウトが正しくレイアウトされる前に、正しいレイアウトを設定する必要があります。

+0

何らかの理由でsetXXSizeを使用しないでください。http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumize-methods-in-java-swi(@Mike Clarkとしてよく) – kleopatra

1

はここにいくつかのヒントです:

  • あなたBoardSquare sが寸法は0x0を持っています。ユーザーに見せたいものには適していません。

  • 何が起こっているのかを視覚化するために、各BoardSquareのサイズを100x100ピクセルにして境界線を付けるようにします。これであなたのGUIにどこに表示されているのかを確認できます。あなたのGUIコードは依然として大きな変更が必要ですが、これは少なくともあなたが扱っているものを見始めることができます。

    public BoardSquare(int p, int q, String type) 
        { 
         this.setBorder(new LineBorder(Color.CYAN, 2)); 
         this.setPreferredSize(new Dimension(100, 100)); 
    
         // ... etc ... 
    
  • BoardSquareウィンドウで絶対一番上の左端の点からの座標に基づいて、その内容を描画するためにコード化されているように見えるが、彼らはBoardSquare自体の一番上の左端の点から身を引くようにコーディングする必要があります。つまり、コンポーネントはそれぞれの境界線内に描画するだけで、0,0がウィンドウではなくコンポーネントの左上を指定する座標を使用する必要があります。

  • BoardSquareJComponent)を使用してフレームに追加する場合は、おそらくGridLayoutのような別のレイアウトマネージャを使用する必要があります。 FlowLayoutは、あなたが望む正確な位置を特定することはできません。

0
import javax.swing.*; 
import javax.swing.border.LineBorder; 

import java.awt.*; 

public class CheckersServer2 
{ 
    public static String type_BLANK = "BLANK"; 
    public static String type_RED = "RED"; 
    public static String type_BLACK = "BLACK"; 

    public static int width = 100; 
    public static int height = 100; 

    public static class Board 
    { 
     private JFrame frame = new JFrame(); 
     private JPanel backBoard = new JPanel(); 

    Board() 
    { 
     int numRows = 8; 
     int numCols = 8; 

     frame.setSize(905,905); 
     backBoard.setSize(900,900); 
     frame.setTitle("Checkers"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     backBoard.setVisible(true); 

     String type; 
     for(int r=0; r<numRows; r++){ 
      for(int c=0; c<numCols; c++){ 
       // 
       type = type_BLANK; 
       if(c%2==0){ 
        if(r==0 || r==2) { 
         type = type_RED; 
        }else if(r==6){ 
         type = type_BLACK; 
        } 
       }else{ 
        if(r==1){ 
         type = type_RED; 
        } else if(r==5 || r==7) { 
         type = type_BLACK; 
        } 
       } 
       backBoard.add(new BoardSquare(r,c,type));    
      }   
     } 

     backBoard.repaint(); 
     frame.add(backBoard); 
     frame.repaint(); 


    } 

    private class BoardSquare extends JComponent 
    { 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 
     private int x; //x position of the rectangle measured from top left corner 
     private int y; //y position of the rectangle measured from top left corner 

     private boolean isBlack = false; 
     private boolean isRed = false; 

     public BoardSquare(int p, int q, String type) 
     { 
      //this.setBorder(new LineBorder(Color.CYAN, 2)); 
      this.setPreferredSize(new Dimension(width, height)); 

      x = p; 
      y = q; 
      if (type.equals(type_BLACK)) 
      { 
       isBlack = true; 
       isRed = false; 
      } 
      else if (type.equals(type_RED)) 
      { 
       isRed = true; 
       isBlack = false; 
      } 
      else if (type.equals(type_BLANK)) 
      { 
       isBlack = false; 
       isRed = false; 
      } 

     } 
     public void paintComponent(Graphics g) 
     { 
      Graphics2D g2 = (Graphics2D) g; 
      Rectangle box = new Rectangle(x,y,width,height); 
      g2.draw(box); 
      g2.setPaint(Color.BLUE); 
      g2.fill(box); 
      int ovalWidth = width - 15; 
      int ovalHeight = ovalWidth; 
      if(isBlack) 
      { 
       g2.setColor(Color.black); 
       g2.fillOval(x, y, ovalWidth, ovalHeight); 
       g2.drawOval(x, y, ovalWidth, ovalHeight); 
      } 

      else if(isRed) 
      { 
       g2.setColor(Color.red); 
       g2.fillOval(x, y, ovalWidth, ovalHeight); 
       g2.drawOval(x, y, ovalWidth, ovalHeight); 
      } 

     } 
    } 


} 


public static void main(String[] args) 
{ 
    Board game = new Board(); 

} 
} 
+0

多分あなたのポストを改善するだろう少しの説明。それはコードのみよりも優れています。 –

関連する問題