Rumah > Java > JAVA: Gerakkan objek dalam anak tetingkap sempadan apabila butang ditekan

JAVA: Gerakkan objek dalam anak tetingkap sempadan apabila butang ditekan

PHPz
Lepaskan: 2024-02-10 13:40:08
ke hadapan
525 orang telah melayarinya

PHP Editor Xinyi hari ini memperkenalkan anda kepada teknik pengaturcaraan JAVA yang menarik: menggerakkan objek dalam anak tetingkap sempadan apabila menekan butang. Teknik ini boleh menambah beberapa interaktiviti pada antara muka pengguna, membolehkan pengguna mengalihkan objek dengan mengklik butang. Kaedah pelaksanaan fungsi ini agak mudah Anda hanya perlu mendengar acara klik butang dan mengemas kini kedudukan objek dalam kaedah pemprosesan acara. Dengan cara ini, kami boleh memberikan pengguna pengalaman antara muka yang lebih jelas dan menarik. Di bawah ini kami akan memperkenalkan proses pelaksanaan teknik ini secara terperinci.

Kandungan soalan

Saya sedang membuat tugasan kerja rumah di mana saya perlu membuat bulatan dalam anak tetingkap dan mengalihkannya menggunakan butang di bahagian bawah skrin. Saya boleh mendapatkan bulatan dan butang untuk muncul dalam anak tetingkap, tetapi apabila saya menekan butang bulatan itu tidak bergerak.

Kaedah utama saya adalah seperti berikut:

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);  
  }  
  
  
}
Salin selepas log masuk

Cara sebenar untuk menggerakkan bulatan adalah di sini:

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);
    }
}
Salin selepas log masuk
Tujuan kaedah

ballcontrol adalah untuk memeriksa sama ada menggerakkan bulatan akan memanjangkannya melepasi sempadan tingkap, dan jika tidak, gerakkannya. Tetapi apabila butang ditekan, bulatan tidak pernah bergerak.

Penyelesaian

borderpane 是一种“布局窗格”,这意味着它将根据自己的算法布局其子节点。特别是,如果该节点可调整大小,并且在其最小、最大和首选大小指定的约束范围内,则 borderpane 将扩展 center 区域中的节点以填充整个区域,然后将其在该区域内居中。 circle Tidak boleh diubah saiz, jadi ia hanya berpusat di kawasan itu.

Mengubah suai koordinat centerxcentery bulatan tidak akan membantu di sini: sempadan susun atur bulatan ialah segi empat tepat kira-kira 20x20 piksel (memandangkan jejari ialah 10, ini ialah segi empat tepat terkecil yang mengandungi bulatan; "anggaran" di sini adalah kerana lejang mungkin memerlukan ruang tambahan). Segi empat tepat akan mempunyai sistem koordinat yang bermula pada jejari tengah dan memanjang ke tengah+jejari, tetapi kemudian ia akan dipusatkan di kawasan tengah mengikut dasar susun atur anak tetingkap sempadan. Sebenarnya, koordinat pusat bulatan berubah, tetapi koordinat ini hanya dalam sistem koordinat bulatan itu sendiri, bukan sistem koordinat anak tetingkap sempadan.

Satu penyelesaian ialah membalut bulatan dalam pane biasa yang tidak melaksanakan reka letak dan letakkan pane di tengah pane. pane boleh diubah saiz, jadi borderpane akan mengubah saiznya kepada saiz penuh kawasan tengah. pane tidak menyusun bulatan, jadi ia kekal pada koordinat yang ditakrifkan oleh pane 中,并将 pane 放置在 borderpane 的中心。 pane 的大小是可调整的,因此 borderpane 会将其大小调整为中心区域的完整大小。 pane 不会对圆进行布局,因此它保留在 centerxcentery tanpa sebarang reka letak tambahan. (Sebenarnya, anda menjadikan sistem koordinat bulatan sama dengan sistem koordinat anak tetingkap.) Ini ialah penyelesaian yang saya gunakan dalam kod di bawah.

Penyelesaian lain ialah memanipulasi sifat translatextranslatey bulatan. Transformasi ini digunakan selepas reka letak. Walau bagaimanapun, dengan penyelesaian ini, menghalang bulatan daripada meninggalkan sempadan bekasnya menjadi lebih rumit. (Saya tidak menunjukkan penyelesaian ini dalam kod di bawah.)

Lihat dokumentasi susun atur untuk butiran lanjut.

Berikut ialah pengubahsuaian untuk menjadikan ini berfungsi. Ambil perhatian bahawa saya juga mengubah suai cara sempadan dikira supaya ia masih berfungsi walaupun tetingkap diubah saiznya.

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);
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci JAVA: Gerakkan objek dalam anak tetingkap sempadan apabila butang ditekan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan