Schachbrett mit automatischer Größenanpassung
So, ich bin versucht, die Anzeige auf einem Schachbrett in javaFX. Ich habe zum ausführen verschiedener Vorgänge und zeichnen Sie auf einige der Fliesen, so habe ich die Verwendung einer Leinwand für jede Kachel und ein GridPane, um Sie zu arrangieren für mich in einem raster Mode.
Leider habe ich einige Probleme mit der Größenänderung des grid Fliesen; ich will meine ganze Schachbrett automatisch anpassen die Größe der Szene. Also, ich habe ein ChangeListener, um sowohl die Höhe und Breite Eigenschaften des GridPane kümmert sich um die Größenänderung der Fliesen. Dies funktioniert nur, wenn das Fenster größer wird, wenn das Fenster verkleinert auf eine kleinere Größe alles noch größer wird!
Hier ist der kürzeste SSCCE ich kam mit nachbildet, mein problem:
package chessboardtest;
import javafx.application.Application;
import javafx.beans.value.*;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.canvas.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.*;
import javafx.stage.Stage;
public class ChessboardTest extends Application {
final int size = 10;
@Override
public void start(Stage primaryStage) {
VBox root = new VBox();
final GridPane chessboard = new GridPane();
fillChessboard(chessboard, size);
ChangeListener<Number> resizeListener = new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
double newWidth = chessboard.getWidth() / size;
double newHeight = chessboard.getHeight() / size;
for(Node n: chessboard.getChildren()) {
Canvas canvas = (Canvas)n;
canvas.setWidth(newWidth);
canvas.setHeight(newHeight);
}
}
};
chessboard.widthProperty().addListener(resizeListener);
chessboard.heightProperty().addListener(resizeListener);
root.getChildren().add(chessboard);
root.setPadding(new Insets(10));
VBox.setVgrow(chessboard, Priority.ALWAYS);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("chessboard");
primaryStage.setScene(scene);
primaryStage.show();
}
void fillChessboard(GridPane pane, int size) {
class RedrawListener implements ChangeListener<Number> {
Color color;
Canvas canvas;
public RedrawListener(Canvas c, int i) {
if(i % 2 == 0) {
color = Color.BLACK;
}
else {
color = Color.WHITE;
}
canvas = c;
}
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
canvas.getGraphicsContext2D().setFill(color);
canvas.getGraphicsContext2D().fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
}
}
for(int row = 0; row < size; row++) {
for(int col = 0, i = row; col < size; col++, i++) {
Canvas c = new Canvas();
RedrawListener rl = new RedrawListener(c, i);
c.widthProperty().addListener(rl);
c.heightProperty().addListener(rl);
pane.add(c, row, col);
}
}
}
public static void main(String[] args) {
launch(args);
}
}
+1 for SSCCE
- Brauchen Sie wirklich eine Leinwand? Können Sie nur so etwas wie eine
StackPane
für die Quadrate?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht brauchen, eine Leinwand (und Sie wahrscheinlich nicht), nur mit
StackPane
s für die Plätze und machen Sie zu füllen, die Breite und die Höhe. Sie können immer fügen Sie eine Leinwand (oder etwas anderes) auf dieStackPane
s zur Anzeige von deren Inhalt.Dies ist eine schöne Lösung, aber die Größenänderung ist so viel einfacher mit data binding in Java FX. Sie verstecken können alle listener-Geschäft auf diese Weise.
Hier ist eine Lösung ähnlich wie James D ' s, aber mit Rechtecken insread von Leinwänden für die Quadrate: