我正在撰寫一個JavaFX代碼,它在用戶每次按下按鈕時生成4種不同的形狀(圓形、矩形、直線、橢圓),到目前為止,我已經完成了圓形和矩形,形狀生成得非常好,但問題是,當我按下按鈕時,我無法移動這些形狀,盡管在我添加按鈕之前,它們移動得非常好,我無法弄清楚代碼出了什么問題。
這里是代碼:
package sample;
import javafx.application.Application。
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.Pane。
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.Line;
import javafx.stage.Stage。
import javafx.scene.control.Button;
import javafx.scene.shape.Rectangle;
import javafx.geometry.Insets;
import java.util.Random;
public class Main extends Application {
窗格pane。
圓圈圓圈。
Rectangle 矩形。
@Override
public void start(Stage primaryStage) {
pane = new Pane();
按鈕 按鈕 = new Button("Generate") 。
CreateRect c = new CreateRect() 。
button.setOnAction(c)。
pane. setPadding(new Insets(30, 30, 30, 30))。)
circle = new Circle(30, 30, 30)。
rectangle = new Rectangle(30, 30,50,20)。)
pane.getChildren().add(button)。
pane.setOnKeyPressed(e -> {
switch (e.getCode()) {
case UP : circle.setCenterY(circle.getCenterY() >
circle.getRadius() ? circle.getCenterY() - 15 :
circle.getCenterY()); break。
case DOWN : circle.setCenterY(circle.getCenterY() <
pane.getHeight() - circle.getRadius() ?
circle.getCenterY() 15 : circle.getCenterY() )。
break。
case LEFT : circle.setCenterX(circle.getCenterX() >
circle.getRadius() ? circle.getCenterX() - 15 :
circle.getCenterX()); break。
case RIGHT : circle.setCenterX(circle.getCenterX() <
pane.getWidth() - circle.getRadius() ?
circle.getCenterX() 15: circle.getCenterX())。)
}
});
Scene scene = new Scene(pane, 500, 300)。)
primaryStage.setTitle("SHAPES")。
primaryStage.setScene(scene);
primaryStage.show()。
pane.requestFocus()。
}
private class CreateRect implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent e) {
double s;
Random generator = new Random()。
s = generator.nextDouble();
pane.getChildren().remove(rectangle);
pane.getChildren().remove(circle)。
if (s < 0.5) {
pane.getChildren().add(rectangle)。
rectangle.setX(100)。
rectangle.setY(100)。
rectangle.setWidth(50);
rectangle.setHeight(20);
rectangle.setFill(Color.RED)。
} else {
pane.getChildren().add(circle);
circle.setCenterX(100)。
circle.setCenterY(100)。
circle.setRadius(80);
circle.setFill(Color.RED)。
}
}
}
public static void main(String[] args){
launch(args)。
}
uj5u.com熱心網友回復:
問題在于,在你按下按鈕后,該按鈕會保留鍵盤焦點,并消耗按鍵事件。一個解決方案是通過將焦點傳遞給例如你創建的形狀來放棄焦點:
private class CreateRect implements EventHandler< ActionEvent> {
public void handle(ActionEvent e) {
double s;
Random generator = new Random()。
s = generator.nextDouble();
pane.getChildren().remove(rectangle);
pane.getChildren().remove(circle)。
if (s < 0.5) {
pane.getChildren().add(rectangle)。
rectangle.setX(100)。
rectangle.setY(100)。
rectangle.setWidth(50);
rectangle.setHeight(20);
rectangle.setFill(Color.RED);
rectangle.requestFocus()。
} else {
pane.getChildren().add(circle);
circle.setCenterX(100)。
circle.setCenterY(100)。
circle.setRadius(80);
circle.setFill(Color.RED);
circle.requestFocus()。
}
}
}
如果你特別想讓按鈕保留焦點(因此它對其通常的按鍵事件做出回應,例如從SPACE生成一個動作,你可以使用一個不同的按鍵事件。但這似乎是一個不太穩健的解決方案(依賴于按鈕的內部事件處理):
pane.setOnKeyReleased(e -> {
/...
});
uj5u.com熱心網友回復:
你的代碼為
switch (e.getCode() ) {
case UP : circle.setCenterY(circle.getCenterY() >
circle.getRadius() ? circle.getCenterY() - 15 :
circle.getCenterY()); break。
case DOWN : circle.setCenterY(circle.getCenterY() <
pane.getHeight() - circle.getRadius() ?
circle.getCenterY() 15 : circle.getCenterY() )。
break。
case LEFT : circle.setCenterX(circle.getCenterX() >
circle.getRadius() ? circle.getCenterX() - 15 :
circle.getCenterX()); break。
case RIGHT : circle.setCenterX(circle.getCenterX() <
pane.getWidth() - circle.getRadius() ?
circle.getCenterX() 15: circle.getCenterX())。)
}
這只是針對圓形,所以你必須在你的代碼中注意其他形狀
例如:
pane.setOnKeyPressed(e -> {
switch (e.getCode()) {
case UP : circle.setCenterY(circle.getCenterY() >
circle.getRadius() ? circle.getCenterY() - 15 :
circle.getCenterY())。)
break。
case DOWN : circle.setCenterY(circle.getCenterY() <
pane.getHeight() - circle.getRadius() ?
circle.getCenterY() 15 : circle.getCenterY() )。
break。
case LEFT : circle.setCenterX(circle.getCenterX() >
circle.getRadius() ? circle.getCenterX() - 15 :
circle.getCenterX())。)
break。
case RIGHT : circle.setCenterX(circle.getCenterX() <
pane.getWidth() - circle.getRadius() ?
circle.getCenterX() 15: circle.getCenterX())。)
break。
}
switch (e.getCode()) {
case UP : rectangle.setY(rectangle.getY()-15) 。
break;
case DOWN : rectangle.setY(rectangle.getY() 15) 。
break;
case LEFT : rectangle.setX(rectangle.getX()-15) 。
break。
case RIGHT : rectangle.setX(rectangle.getX() 15) 。
break。
}
});
(最好用更多的OOP方法)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333325.html
標籤:
