0

自作の gridPanel の JFrame に線を引いています。

問題は、2 点間に線を引くことです。ポイント 1 とポイント 2 の間の線と、ポイント 2 とポイント 3 の間の線がある場合、線は接続する必要があります。ただし、そうではありません。その間に小さなギャップがあり、その理由はわかりません。しかし、指定されたポイントの終わりまで描画されていません。(開始点は正しいです。)

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

public void initialize(){
     this.setLayout(new BorderLayout());

    this.setPreferredSize(new Dimension(500, 400));
    gridPane = new GridPane();
    gridPane.setBackground(Color.WHITE);
    gridPane.setSize(this.getPreferredSize());
    gridPane.setLocation(0, 0);
    this.add(gridPane,BorderLayout.CENTER);

    //createSampleLabyrinth();
    drawWall(0,5,40,5);  //These are the 2 lines that don't connect.
    drawWall(40,5,80,5);
    this.pack();
}

drawWall は、GridPane 内のメソッドを呼び出すメソッドを呼び出します。gridPane の関連コード:

/**
 * Draws a wall on this pane. With the starting point being x1, y1 and its end x2,y2.
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 */
public void drawWall(int x1, int y1, int x2, int y2) {
    Wall wall = new Wall(x1,y1,x2,y2, true);
    wall.drawGraphic();
    wall.setLocation(x1, y1);
    wall.setSize(10000,10000);
    this.add(wall, JLayeredPane.DEFAULT_LAYER);
    this.repaint();
}

このメソッドは壁を作成し、それを Jframe に配置します。壁の関連コード:

public class Wall extends JPanel {
private int x1;
private int x2;
private int y1;
private int y2;
private boolean black;

/**
 * x1,y1 is the start point of the wall (line) end is x2,y2
 * 
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 */
public Wall(int x1, int y1, int x2, int y2, boolean black) {
    this.x1 = x1;
    this.x2 = x2;
    this.y1 = y1;
    this.y2 = y2;
    this.black = black;
    setOpaque(false);
}

private static final long serialVersionUID = 1L;

public void drawGraphic() {
    repaint();
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    if(black){
        g2.setColor(Color.BLACK);
        g2.setStroke(new BasicStroke(8));
    } else {
        g2.setColor(Color.YELLOW);
        g2.setStroke(new BasicStroke(3));
    }
    g2.drawLine(x1, y1, x2, y2);
}

}

それで、どこが間違っているのですか?true/false は、壁を黒にするか黄色にするかを決定するものであり、気にする必要はありません。

4

1 に答える 1

1

メインレイアウトをBorderLayout使用するように設定しましたthis.setLayout(new BorderLayout());

GridPane次に、を中央の位置に追加しますthis.add(gridPane,BorderLayout.CENTER);

this.add(wall, JLayeredPane.DEFAULT_LAYER);次に、...を使用してメイン レイアウトに壁を追加しようとしますが、メイン レイアウトはBorderLayout

これにより、いくつかの問題が発生します

更新しました

あなたが持っている他の問題はWall#paintComponent方法にあります。

x1およびの位置からずれた線分を描画してy1いますが、コンポーネントはこの時点で既に配置されています。

コンポーネントの左上隅は常に 0x0 です。

g2.drawLine(x1, y1, x2, y2);は次のように読む必要があります...

int x = x2 - x1;
int y = y2 - y1;
g2.drawLine(0, 0, x, y);

更新しました

また、コンポーネントのサイズを任意の値 (1000x1000 など) に設定することは避け、コンポーネントがフィードバックを提供する機能にもっと依存する必要があります...

public Dimension getPreferredSize() {
    int width = Math.max(x1, x2) - Math.min(x1, x2);
    int height = Math.max(y1, y2) - Math.min(y1, y2);

    if (black) {
        width += 8;
        height += 8;
    } else {
        width += 3;
        height += 3;
    }

    return new Dimension(width, height);
}

次に、を追加するときに、代わりにWall使用できますwall.setSize(wall.getPreferredSize())...

于 2012-11-03T10:40:33.890 に答える