Heim  >  Artikel  >  JAVA: Objekt im Randbereich verschieben, wenn die Taste gedrückt wird

JAVA: Objekt im Randbereich verschieben, wenn die Taste gedrückt wird

PHPz
PHPznach vorne
2024-02-10 13:40:08478Durchsuche

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.

Frageninhalt

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);
    }
}
Der Zweck der

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.

Problemumgehung

borderpane 是一种“布局窗格”,这意味着它将根据自己的算法布局其子节点。特别是,如果该节点可调整大小,并且在其最小、最大和首选大小指定的约束范围内,则 borderpane 将扩展 center 区域中的节点以填充整个区域,然后将其在该区域内居中。 circle Die Größe kann nicht geändert werden, daher wird es nur in diesem Bereich zentriert.

Das Ändern der centerxcentery 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 不会对圆进行布局,因此它保留在 centerxcentery 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 translatextranslatey 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen