3

コンピューター サイエンスのクラスで橋を渡るゲームを作成していて、問題のグラフィック表現を作成する必要があります。グラフィカルな表現は、BridgeCanvas クラスによって描画されます。このクラスは、JComponent から拡張された Canvas クラスを拡張します。

BridgeCanvas オブジェクトを JFrame に直接追加すると正しく表示されるため、BridgeCanvas がグラフィックを正しく描画していることはわかっていますが、最初に BridgeCanvas を JPanel に配置してから JFrame に追加すると、表示されません (すべて私は空白のフレームです)。クラスメートの 1 人が、私が Mac を使っているからかもしれないと言っていました。また、私はこれをネットビーンズでやっています。

これが BridgeCanvas クラスです (メイン メソッドもこのクラスに含まれています)。

public class BridgeCanvas extends Canvas {

// Initializes the background, river, bridge, and character graphics    
public BridgeCanvas(State state) {
    super(state);

    background = new RoundRectangle2D.Double(0, 0, 400, 400, 40, 40);

    bridge = new GeneralPath();
    bridge.moveTo(100, 175);
    bridge.curveTo(200, 120, 200, 120, 300, 175);
    bridge.lineTo(300, 225);
    bridge.curveTo(200, 170, 200, 170, 100, 225);
    bridge.closePath();

    river = new GeneralPath();
    river.moveTo(150, 0);
    river.curveTo(50, 100, 150, 200, 150, 200);
    river.curveTo(225, 300, 150, 400, 150, 400);
    river.lineTo(250, 400);
    river.curveTo(325, 300, 250, 200, 250, 200);
    river.curveTo(150, 100, 250, 0, 250, 0);
    river.closePath();

    AffineTransform transform = new AffineTransform();
    transform.setToTranslation(25, 25);

    // generateShapeFromText is method used to create shapes from numbers.

    P1 = (GeneralPath) generateShapeFromText(new Font(Font.MONOSPACED, Font.BOLD, 32), "P1");
    P1 = (GeneralPath) P1.createTransformedShape(transform);
    P2 = (GeneralPath) generateShapeFromText(new Font(Font.MONOSPACED, Font.BOLD, 32), "P2");
    transform.setToTranslation(25, 100);
    P2 = (GeneralPath) P2.createTransformedShape(transform);
    FL = (GeneralPath) generateShapeFromText(new Font(Font.MONOSPACED, Font.BOLD, 32), "F");
    P5 = (GeneralPath) generateShapeFromText(new Font(Font.MONOSPACED, Font.BOLD, 32), "P5");
    P10 = (GeneralPath) generateShapeFromText(new Font(Font.SANS_SERIF, Font.BOLD, 32), "P10");


}

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    super.paintComponent(g); 
    g2.setFont(new Font(Font.MONOSPACED, Font.BOLD, 32));
    BridgeState state = (BridgeState) getState();

    g2.setColor(new Color(0, 140, 0));
    g2.fill(background);
    g2.setColor(new Color(0, 0, 200));
    g2.fill(river);
    g2.setColor(new Color(169, 69, 19));
    g2.fill(bridge);
    g2.setColor(Color.BLACK);
    g2.fill(P1);
    g2.fill(P2);

}


private RoundRectangle2D.Double background;
private GeneralPath bridge;
private GeneralPath river;
private GeneralPath P1;
private GeneralPath P2;
private GeneralPath FL;
private GeneralPath P5;
private GeneralPath P10;

public static void main(String[] args) {
    JFrame frame = new JFrame();
    BridgeState state = new BridgeState(Position.WEST, Position.WEST, Position.WEST, Position.WEST, Position.WEST, 0);
    BridgeCanvas canvas = new BridgeCanvas(state);
    JComponent panel = new JPanel();
    panel.add(canvas);
    panel.setLayout(new FlowLayout());
    panel.setOpaque(false);
    panel.setSize(new Dimension(440, 440));

    frame.setPreferredSize(new Dimension(440, 440));
    frame.add(panel);

    frame.setVisible(true);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}
4

1 に答える 1

3

BridgeCanvas オブジェクトのサイズを見てください。これを JPanel に追加し、JPanel がそのデフォルトの FlowLayout を使用する場合、JComponent 派生オブジェクトのサイズは最大で 1 x 1 ピクセルになるため、作成、追加、および表示されている間、価値のあるものは何も表示されません。

getSize()実際、これは、BridgeCanvas のメソッドにメソッドを(一時的に) 挿入することで簡単にテストできます。このpaintComponent(...)メソッドは、オブジェクトが表示されている場合にのみ呼び出されます。

public void paintComponent(Graphics g) {

    // TODO: delete line below!
    System.out.println("BridgeCanvas Size: " + getSize());

    Graphics2D g2 = (Graphics2D) g;
    super.paintComponent(g); 
    g2.setFont(new Font(Font.MONOSPACED, Font.BOLD, 32));

    // .... etc...

}

考えられる解決策: BridgeCanvas のgetPreferredSize()メソッドをオーバーライドし、実際に希望するサイズを保持する Dimension を返すようにします。

注:この設定は、BridgeCanvas オブジェクトを使用するコードによって変更される可能性があるsetSize()ため、(メモSwing の専門家 Jeanette/kleopatra によると) 呼び出しも避けたいと思うでしょう。setPreferredSize()

于 2013-03-31T00:46:21.340 に答える