PHP-Editor Xinyi stellt Ihnen heute eine interessante JAVA-Programmiertechnik vor: das Verschieben von Objekten im Randbereich per Knopfdruck. Diese Technik kann der Benutzeroberfläche etwas Interaktivität hinzufügen und es Benutzern ermöglichen, Objekte durch Klicken auf Schaltflächen zu verschieben. Die Implementierungsmethode dieser Funktion ist relativ einfach. Sie müssen nur das Klickereignis der Schaltfläche abhören und die Position des Objekts in der Ereignisverarbeitungsmethode aktualisieren. Auf diese Weise können wir den Benutzern ein lebendigeres und interessanteres Interface-Erlebnis bieten. Im Folgenden stellen wir den Implementierungsprozess dieser Technik im Detail vor.
Ich mache eine Hausaufgabe, bei der ich einen Kreis in einem Bereich erstellen und ihn mithilfe der Schaltflächen am unteren Bildschirmrand verschieben muss. Ich kann den Kreis und die Schaltfläche im Bereich anzeigen lassen, aber wenn ich die Schaltfläche drücke, bewegt sich der Kreis nicht.
Meine Hauptmethode ist wie folgt:
import javafx.application.application; import javafx.event.actionevent; import javafx.event.eventhandler; import javafx.geometry.insets; import javafx.geometry.pos; import javafx.scene.scene; import javafx.scene.control.button; import javafx.scene.layout.borderpane; import javafx.scene.layout.hbox; import javafx.scene.layout.pane; import javafx.scene.paint.color; import javafx.scene.shape.circle; import javafx.stage.stage; public class moveball extends application { @override public void start(stage primarystage) { circle ball = new circle(10); button btup = new button("up"); button btdown = new button("down"); button btleft = new button("left"); button btright = new button("right"); hbox pane = new hbox(); borderpane bpane = new borderpane(); ball.setfill(color.red); ball.setstroke(color.black); pane.setspacing(10); pane.setalignment(pos.center); pane.getchildren().addall(btup, btdown, btleft, btright); bpane.setcenter(ball); bpane.setbottom(pane); btup.setonaction((actionevent e) -> ballcontrol.moveup(ball)); btdown.setonaction((actionevent e) -> ballcontrol.movedown(ball)); btleft.setonaction((actionevent e) -> ballcontrol.moveleft(ball)); btright.setonaction((actionevent e) -> ballcontrol.moveright(ball)); scene scene = new scene(bpane, 400, 400); primarystage.setscene(scene); primarystage.settitle("move the ball"); primarystage.show(); } public static void main (string[] args) { launch(args); } }
Die tatsächliche Möglichkeit, einen Kreis zu verschieben, ist hier:
class BallControl{ public static void moveUp(Circle circle){ if(circle.getCenterY() - circle.getRadius() - 10 < 0) return; circle.setCenterY(circle.getCenterY() - 10); } public static void moveDown(Circle circle){ if(circle.getCenterY() + circle.getRadius() + 10 > 400) return; circle.setCenterY(circle.getCenterY() + 10); } public static void moveLeft(Circle circle){ if(circle.getCenterX() - circle.getRadius() - 10 < 0) return; circle.setCenterX(circle.getCenterX() - 10); } public static void moveRight(Circle circle){ if(circle.getCenterX() + circle.getRadius() + 10 > 400) return; circle.setCenterX(circle.getCenterX() + 10); } }
ballcontrol-Methode besteht darin, zu prüfen, ob das Bewegen des Kreises ihn über die Fenstergrenzen hinaus erweitert, und wenn nicht, verschieben Sie ihn. Aber wenn der Knopf gedrückt wird, bewegt sich der Kreis nie.
borderpane
是一种“布局窗格”,这意味着它将根据自己的算法布局其子节点。特别是,如果该节点可调整大小,并且在其最小、最大和首选大小指定的约束范围内,则 borderpane
将扩展 center
区域中的节点以填充整个区域,然后将其在该区域内居中。 circle
Die Größe kann nicht geändert werden, daher wird es nur in diesem Bereich zentriert.
Das Ändern der centerx
和 centery
Koordinaten des Kreises wird hier nicht helfen: Die Layoutgrenzen des Kreises sind ein Rechteck von etwa 20 x 20 Pixeln (da der Radius 10 beträgt, ist dies das kleinste Rechteck, das den Kreis enthält; „ungefähr“ steht hier, weil der Strich ggf etwas mehr Platz benötigen). Das Rechteck verfügt über ein Koordinatensystem, das am Mittelpunktradius beginnt und sich bis Mittelpunkt+Radius erstreckt, dann wird es jedoch entsprechend der Layoutstrategie des Randbereichs im Mittelpunktbereich zentriert. Tatsächlich ändern sich die Koordinaten des Kreismittelpunkts, aber diese Koordinaten liegen nur innerhalb des Koordinatensystems des Kreises selbst, nicht des Koordinatensystems der Randscheibe.
Eine Lösung besteht darin, den Kreis in einen regulären pane
einzuschließen, der kein Layout ausführt, und den pane
in der Mitte des borderpane
zu platzieren. Die Größe des Bereichs
kann geändert werden, sodass der Rahmenbereich
die Größe auf die volle Größe des mittleren Bereichs anpasst. pane
legt kein Layout für den Kreis fest, sodass er ohne zusätzliches Layout an den durch pane
中,并将 pane
放置在 borderpane
的中心。 pane
的大小是可调整的,因此 borderpane
会将其大小调整为中心区域的完整大小。 pane
不会对圆进行布局,因此它保留在 centerx
和 centery
definierten Koordinaten bleibt. (Eigentlich machen Sie das Koordinatensystem des Kreises zum gleichen Koordinatensystem wie das Fenster.) Dies ist die Lösung, die ich im folgenden Code verwende.
Eine andere Lösung besteht darin, die translatex
和 translatey
Eigenschaften des Kreises zu manipulieren. Diese Transformationen werden nach dem Layout angewendet. Mit dieser Lösung wird es jedoch schwieriger, zu verhindern, dass der Kreis die Grenzen seines Containers verlässt. (Ich zeige diese Lösung nicht im folgenden Code.)
Weitere Informationen finden Sie in der Layout-Dokumentation.
Hier sind die Änderungen, damit dies funktioniert. Beachten Sie, dass ich auch die Berechnung der Grenzen geändert habe, sodass sie auch dann noch funktioniert, wenn die Fenstergröße geändert wird.
package org.jamesd.examples.movingball; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; public class MoveBall extends Application { @Override public void start(Stage primaryStage) { Circle ball = new Circle(200, 200, 10); Button btUp = new Button("Up"); Button btDown = new Button("Down"); Button btLeft = new Button("Left"); Button btRight = new Button("Right"); HBox controls = new HBox(); BorderPane bPane = new BorderPane(); ball.setFill(Color.RED); ball.setStroke(Color.BLACK); controls.setSpacing(10); controls.setAlignment(Pos.CENTER); controls.getChildren().addAll(btUp, btDown, btLeft, btRight); Pane ballPane = new Pane(ball); bPane.setCenter(ballPane); bPane.setBottom(controls); btUp.setOnAction((ActionEvent e) -> moveUp(ball)); btDown.setOnAction((ActionEvent e) -> moveDown(ball)); btLeft.setOnAction((ActionEvent e) -> moveLeft(ball)); btRight.setOnAction((ActionEvent e) -> moveRight(ball)); Scene scene = new Scene(bPane, 400, 400); primaryStage.setScene(scene); primaryStage.setTitle("Move the Ball"); primaryStage.show(); } public static void main (String[] args) { launch(args); } public void moveUp(Circle circle){ if(circle.getCenterY() - circle.getRadius() - 10 < 0) return; circle.setCenterY(circle.getCenterY() - 10); } public void moveDown(Circle circle){ if(circle.getCenterY() + circle.getRadius() + 10 > circle.getParent().getBoundsInLocal().getHeight()) return; circle.setCenterY(circle.getCenterY() + 10); } public void moveLeft(Circle circle){ System.out.println(circle.getBoundsInLocal()); if(circle.getCenterX() - circle.getRadius() - 10 < 0) return; circle.setCenterX(circle.getCenterX() - 10); } public void moveRight(Circle circle){ if(circle.getCenterX() + circle.getRadius() + 10 > circle.getParent().getBoundsInLocal().getWidth()) return; circle.setCenterX(circle.getCenterX() + 10); } }
Das obige ist der detaillierte Inhalt vonJAVA: Objekt im Randbereich verschieben, wenn die Taste gedrückt wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!