1

こんにちはすべて私は私が修正できないように見えるこの問題を抱えています。私はいくつかのコードを与えられており、「三目並べ」ゲームを作成する必要があります。かなり原始的です。現時点では、ユーザー入力を取得し(マーカーを配置する行/列を要求するだけです)、ボードの適切な正方形に楕円を描画することを目的としています。私の現在のコードは、ユーザー入力を処理するための新しいクラスを作成することを指定した作業に続くものです。

私は現在、JFrameに新しいアイテムを追加するためにそれを取得しようとしているだけですが、ほとんど成功していません。入力のダミー呼び出しがあります。入力した内容を確認するのではなく、左上隅の最初の正方形に配置する必要がある楕円を呼び出すだけです。オブジェクトをJFrameに描画することはできますが(フレーム全体を占めますが)、常に実際のボードの背後にあります(つまり、フレームを伸ばすと円が見えます)。ボードの上にJPanelsなどを追加してみましたが、今のところ運が悪いです。

これが私がタスクのために与えられた楕円形を作成するためのコードです。私がしているのは、位置(0,0,10,10)で新しい楕円をインスタンス化することだけです。それが描くとき、​​それは全体のJFrameを占めますが、それは実際のボードの後ろにもあります......何かアイデアはありますか?

package lab4;

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

/** Oval Supplier Class 
 * Author: David D. Riley
 * Date: April, 2004
 */
public class Oval extends JComponent  {

    /** post:   getX() == x  and  getY() == y
     *          and  getWidth() == w  and getHeight() == h
     *          and  getBackground() == Color.black
     */
    public Oval(int x, int y, int w, int h)  {
        super();
        setBounds(x, y, w, h);
        setBackground(Color.black);
    }

    /** post:   this method draws a filled Oval
     *          and  the upper left corner of the bounding rectangle is (getX(), getY()) 
     *          and  the oval's dimensions are getWidth() and getHeight()
     *          and  the oval's color is getBackground()
     */
    public void paint(Graphics g)  {
        g.setColor( getBackground() );
        g.fillOval(0, 0, getWidth()-1, getHeight()-1);
        paintChildren(g);
   }

}

編集:これは今私たちが探しているコードです-

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package lab4;

/**
 *
 * @author Scott
 */
import java.awt.*;
import java.util.Scanner;
import javax.swing.*;

public class GameBoard {

    private JFrame win;
    private int count = 1;

    //Create new GUI layout
    GridLayout layout = new GridLayout(3, 3);
    JPanel panel = new JPanel(layout);

    //Create a new Array of Rectangles
    Rectangle[][] rect = new Rectangle[3][3];

    public GameBoard() {


        //Create new JFrame + Set Up Default Behaviour
        win = new JFrame("Tic Tac Toe");

        win.setBounds(0, 0, 195, 215);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(true);

        //Loop goes through each line of the array. It creates a new rectangle
        //determines it's colour based on modulus division
        //Add's the rectangle to the JPanel.
        for (int i = 0; i < rect.length; i++) {
            for (int j = 0; j < rect[i].length; j++) {
                rect[i][j] = new Rectangle(0, 0, 1, 1);
                if (count % 2 != 0) {
                    rect[i][j].setBackground(Color.black);
                } else {
                    rect[i][j].setBackground(Color.red);
                }
                panel.add(rect[i][j]);
                count++;
            }
        }


        //Sets the game to be visible.
        win.add(panel);
        win.setVisible(true);
        //userInput();
    }

    private void userInput() {
    Scanner scan = new Scanner(System.in);
    }
}
4

2 に答える 2

1

楕円形のクラスから始めましょう...

これは非常に悪い考えです...

public void paint(Graphics g)  {
    // No super.paint(g) call, hello to a world of pain...
    // Paint some stuff
    g.setColor( getBackground() );
    g.fillOval(0, 0, getWidth()-1, getHeight()-1);
    // Then draw the children over it...???
    paintChildren(g);
}

これはより良いアプローチです。

protected void paintComponent(Graphics g)  {
    super.paintComponent(g);
    g.setColor( getBackground() ); // Might want to pick a better color...
    g.fillOval(0, 0, getWidth()-1, getHeight()-1);

}

推測では、あなたのウィンドウはあなたのsetBounds呼び出しを上書きしているレイアウトマネージャーを使用していることをお勧めします

于 2012-09-19T06:37:29.910 に答える
0

答えは、フローレイアウトに固執し、手動で長方形のサイズを変更し、代わりにJLayeredPaneを使用する必要があるということでした。これが存在することに気づかず、私の思考プロセスは正しいと彼が私にそれをするように意図した方法であると言った私の講師に話しました......なんて苦痛でしたが、助けてくれた人々のおかげですべてが行われました。

于 2012-10-03T04:09:35.057 に答える