0

シンプルなサイコロ ゲームを作成しました。diceFace を定義する DiceFace クラスがあります。

    package panel;
    import java.awt.*;
    import java.awt.geom.*;
    import javax.swing.*;

    public class DiceFace
     {

  // Holds the seven possible dot positions on a standard die
  private Ellipse2D.Double[] dots = new Ellipse2D.Double[7];

 private Rectangle box;
 private int xLeft;
 private int yTop;
 private int side;
 private int diceValue;

public DiceFace(int s, int x, int y, int v)
{
    side = s;       // dimension of dice face
    xLeft = x;      // position
    yTop = y;       // position
    diceValue = v; // pip value
}

public void draw(Graphics2D g2)
{
    box = new Rectangle(xLeft, yTop, side, side);
  makeDots();

  // Black background
    g2.setColor(Color.BLACK);
  g2.fill(box);
  // White dots on black
  g2.setColor(Color.WHITE);

    // Draw dots
  if (diceValue == 1) 
        g2.fill(dots[0]);
  else if (diceValue == 2)
  {
     g2.fill(dots[1]); g2.fill(dots[2]);
  }
  else if (diceValue == 3)
  {
     g2.fill(dots[0]); g2.fill(dots[1]); g2.fill(dots[2]);
  }
  else if (diceValue == 4)
  {
     g2.fill(dots[1]); g2.fill(dots[2]);
     g2.fill(dots[3]); g2.fill(dots[4]);
  }
  else if (diceValue == 5)
  {
     g2.fill(dots[0]); g2.fill(dots[1]);
     g2.fill(dots[2]); g2.fill(dots[3]); g2.fill(dots[4]);
   }
  else if (diceValue == 6)
  {
     g2.fill(dots[1]); g2.fill(dots[2]); g2.fill(dots[3]);
     g2.fill(dots[4]); g2.fill(dots[5]); g2.fill(dots[6]);
   }
}


public void makeDots()
{
   int w = side/6;   // dot width
   int h = side/6;   // dot height

   dots[0] =  new Ellipse2D.Double(xLeft + (2.5 * side)/6,
                                     yTop + (2.5 * side)/6, h, w);

   dots[1] = new Ellipse2D.Double(xLeft + (3.75 * side)/6,
                                    yTop + (3.75 * side)/6, h, w);

   dots[2] = new Ellipse2D.Double(xLeft + (1.25 * side)/6,
                                    yTop + (1.25 * side)/6, h, w);

   dots[3] = new Ellipse2D.Double(xLeft + (1.25 * side)/6,
                                    yTop + (3.75 * side)/6, h, w);

   dots[4] = new Ellipse2D.Double(xLeft + (3.75 * side)/6,
                                    yTop + (1.25 * side)/6, h, w);

   dots[5] =  new Ellipse2D.Double(xLeft + (1.25 * side)/6,
                                     yTop + (2.5 * side)/6, h, w);

   dots[6] =  new Ellipse2D.Double(xLeft + (3.75 * side)/6,
                                     yTop + (2.5 * side)/6, h, w);
}

}

JComponentを拡張するクラスDiceFaceConstructorもあります

package panel;

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;


public class DiceFaceComponent extends JComponent {



public void paintComponent(Graphics g) //method returns void, takes object of type           Graphics which it refers to internally as g
{
    Graphics2D g2 = (Graphics2D)g; //casting 

    DiceFace dice1 = new DiceFace(60,0,0,6);  
    dice1.draw(g2); //draw the andgate  
    }

}

最後に、メイン メソッドとフレームを持つビューアー クラスがあります。以下のパッケージ パネルのように、新しいサイコロ面オブジェクトをフレームに直接描画すると、問題なく動作します (サイコロが表示されます)。

    import java.awt.Component;

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

    public class PanelViewer
    {

/**
 * @param args
 */
public static void main(String[] args)
{

 JFrame frame = new JFrame();
 frame.setSize(600, 400);
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.add(dice1)
 DiceFaceComponent dice1 = new DiceFaceComponent();
     frame.add(dice1)
 //JPanel panel1 = new JPanel();
 //panel1.add(dice1);

 //frame.add(panel1);
 //frame.pack();
 frame.setVisible(true); 




}

      }

問題は、ダイス コンポーネントをパネルに追加しようとして、パネルをフレームに追加しようとすると、以下のように何も表示されないことです。助けてください、5時間経ちました。

    package panel;

    import java.awt.Component;

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

    public class PanelViewer
     {

/**
 * @param args
 */
public static void main(String[] args)
{

 JFrame frame = new JFrame();
 frame.setSize(600, 400);
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 DiceFaceComponent dice1 = new DiceFaceComponent();
 JPanel panel1 = new JPanel();
 panel1.add(dice1);
 frame.add(panel1);
 frame.pack();
 frame.setVisible(true); 




}

  }
4

1 に答える 1

1

あなたのものはレイアウトの問題です。JFrame はデフォルトで BorderLayout を使用し、JPanel は FlowLayout を使用します。DiceFaceComponent JComponent を FlowLayout を使用する JPanel に追加することにより、DiceFaceComponent JComponent は、おそらく [0, 0] または最大で [1, 1] の preferredSize にサイズ変更しようとします。簡単な解決策の 1 つは、JPanel BorderLayout を指定すると、JComponent がそれを埋めて表示することです。

別のオプションは、

  • public Dimension getPreferredSize()画像を表示するのに十分な大きさの Dimension を返すDiceFace クラスを指定します。これはメソッドのオーバーライドではありません。
  • DiceFaceComponent JComponent にプライベート DiceFace フィールドを与えます。このフィールドは、そのコンストラクターによって設定でき、(必要に応じて) セッター メソッドで変更できます。
  • この DiceFace インスタンスが null でない場合は、DiceFaceComponent JComponent の paintComponent メソッドをオーバーライドして、この DiceFace インスタンスを描画します。メソッド内で新しい DiceFace インスタンスを作成しないでください。
  • DiceFaceComponent JComponent に、getPreferredSize()最適なサイズをインテリジェントに選択するのに役立つオーバーライド メソッドを提供します。メソッドは DiceFace インスタンスが null かどうかをチェックし、そうであればスーパー メソッドを呼び出し、そうでなければ DiceFace インスタンスのgetPreferredSize()メソッドを呼び出します。
于 2013-11-02T02:28:51.273 に答える