Maison  >  Article  >  JAVA : déplacer l'objet dans le volet de bordure lorsque le bouton est enfoncé

JAVA : déplacer l'objet dans le volet de bordure lorsque le bouton est enfoncé

PHPz
PHPzavant
2024-02-10 13:40:08506parcourir

L'éditeur PHP Xinyi vous présente aujourd'hui une technique de programmation JAVA intéressante : déplacer des objets dans le volet de bordure lorsque vous appuyez sur un bouton. Cette technique peut ajouter une certaine interactivité à l'interface utilisateur, permettant aux utilisateurs de déplacer des objets en cliquant sur des boutons. La méthode d'implémentation de cette fonction est relativement simple. Il suffit d'écouter l'événement clic du bouton et de mettre à jour la position de l'objet dans la méthode de traitement de l'événement. De cette façon, nous pouvons offrir aux utilisateurs une expérience d’interface plus vivante et plus intéressante. Ci-dessous, nous présenterons en détail le processus de mise en œuvre de cette technique.

Contenu de la question

Je fais un devoir dans lequel je dois créer un cercle dans un volet et le déplacer à l'aide des boutons en bas de l'écran. Je parviens à faire apparaître le cercle et le bouton dans le volet, mais lorsque j'appuie sur le bouton, le cercle ne bouge pas.

Ma méthode principale est la suivante :

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);  
  }  
  
  
}

La véritable façon de déplacer un cercle est ici :

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);
    }
}
Le but de la méthode

ballcontrol est de vérifier si le déplacement du cercle l'étendra au-delà des limites de la fenêtre, et sinon, de le déplacer. Mais quand on appuie sur le bouton, le cercle ne bouge jamais.

Contournement

borderpane 是一种“布局窗格”,这意味着它将根据自己的算法布局其子节点。特别是,如果该节点可调整大小,并且在其最小、最大和首选大小指定的约束范围内,则 borderpane 将扩展 center 区域中的节点以填充整个区域,然后将其在该区域内居中。 circle Non redimensionnable, donc il se concentre uniquement dans cette zone.

Modifier les coordonnées centerxcentery du cercle n'aidera pas ici : les limites de la disposition du cercle seront un rectangle d'environ 20x20 pixels (puisque le rayon est de 10, c'est le plus petit rectangle qui contient le cercle ; "approximativement" ici est parce que le trait peut besoin d'espace supplémentaire). Le rectangle aura un système de coordonnées qui commence au rayon central et s'étend jusqu'au centre + rayon, mais il sera ensuite centré dans la zone centrale conformément à la politique de disposition du volet de bordure. En fait, les coordonnées du centre du cercle changent, mais ces coordonnées se trouvent uniquement dans le système de coordonnées du cercle lui-même, et non dans le système de coordonnées du volet de bordure.

Une solution consiste à envelopper le cercle dans un volet normal qui n'effectue pas de mise en page, et à placer le volet au centre du borderpane. Le pane est redimensionnable, donc le borderpane le redimensionnera à la taille maximale de la zone centrale. Le pane ne dispose pas le cercle, il reste donc aux coordonnées définies par pane 中,并将 pane 放置在 borderpane 的中心。 pane 的大小是可调整的,因此 borderpane 会将其大小调整为中心区域的完整大小。 pane 不会对圆进行布局,因此它保留在 centerxcentery sans aucune disposition supplémentaire. (En fait, vous faites en sorte que le système de coordonnées du cercle soit identique à celui du volet.) C'est la solution que j'utilise dans le code ci-dessous.

Une autre solution consiste à manipuler les translatextranslatey propriétés du cercle. Ces transformations sont appliquées après la mise en page. Cependant, avec cette solution, empêcher le cercle de sortir des limites de son contenant devient plus compliqué. (Je ne montre pas cette solution dans le code ci-dessous.)

Voir la documentation de mise en page pour plus de détails.

Voici les modifications pour que cela fonctionne. Notez que j'ai également modifié la façon dont les limites sont calculées afin que cela fonctionne toujours même si la fenêtre est redimensionnée.

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);
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer