2

編集:わかりました、理由がわかりました。

私の getX と getY は Component のものをオーバーライドしていました。したがって、私の出力は1ピクセル単位のようでした...もっと早く考えるべきでした。

私を助けようとした人に感謝します!

元の質問:

黒または白のラベルである正方形で構成されたボードを(真剣に)表示することになっている JPanel から継承するこの Board クラスがあります。私は GridLayout を使用していますが、アプリケーションを起動すると (JPanel をダミーの JFrame に配置した後)、JLabels が左隅に重なり合っているように見えますが、これは私が望むものではありません。ただし、適切な座標とラベルの色が黒と白の間で切り替わるため、マウスリスナーは正しく動作しているようです。

コードは次のとおりです。

public class Board extends JPanel {
private int dimx,dimy;
private Square[][] squares;

public Board(int x, int y){
    super();
    this.setLayout(new GridLayout(x,y));

    dimx = x;
    dimy = y;
    squares = new Square[dimx][dimy];
    for(int i=0; i<dimx; i++){
        for(int j=0; j<dimy; j++){
            Square sq = new Square(i,j);
            squares[i][j] = sq;
            this.add(sq);
            sq.addMouseListener(new SquareListener(i,j,this));
        }
    }
}

public Square[][] getSquares() {
    return squares;
}
}

public class Square extends JLabel {

private boolean black;
private int x,y;
private char c;

public Square(int x, int y){
    super();
    setBackground(Color.WHITE);
    Border blackline = BorderFactory.createLineBorder(Color.black);
    setBorder(blackline);
    setOpaque(true);
    setHorizontalAlignment(JLabel.CENTER);

    this.x = x;
    this.y =y;

    c = ' ';
}

public void toggle(){
    black = !black;
}

public boolean isBlack(){
    return black;
}

public int getX(){
    return x;
}

public int getY(){
    return y;
}

public char getC() {
    return c;
}

public void setC(char c) {
    this.c = c;
}

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if(isBlack()){
        setBackground(Color.BLACK);
    }
    else{
        setBackground(Color.WHITE);
    }
}
}


public class SquareListener implements MouseListener{

private int x,y;
private Board board;

public SquareListener(int x, int y, Board b){
    this.x = x;
    this.y = y;
    this.board = b;
}

@Override
public void mouseClicked(MouseEvent arg0) {
    board.getSquares()[x][y].toggle();
    board.repaint();
    System.out.println("Clicked on "+x+","+y);
}
4

2 に答える 2

0

わかりました、理由がわかりました。

私の getX と getY は Component のものをオーバーライドしていました。したがって、私の出力は 1 平方単位ではなく 1 ピクセル単位のようでした...もっと前に考えておくべきでした。

私を助けようとした人に感謝します!

于 2012-06-13T03:58:48.050 に答える