我见过许多在主类中编写AnimationTimer和KeyListener的示例,但在另一个类中没有看到。
我尝试过如何在“VolleyController”中为JavaFX编写一个KeyListener,但我不知道为什么它不起作用。
首先,我使用KeyEvent移动图像,就像第一个代码一样。第三个代码是我的主类。我想重写这些方法来移动图像,就像第二个代码一样。
但是我遇到了第二个代码中写的一些错误。我该如何处理?
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
public class VolleyController implements EventHandler<KeyEvent> {
double pika1LocationY = 556;
double pika2LocationY = 556;
double pika1LocationX = 0;
double pika2LocationX = 1050;
boolean pika2MoveLeft = false;
boolean pika2MoveRight = false;
boolean pika1MoveLeft = false;
boolean pika1MoveRight = false;
@FXML
ImageView pika1,pika2,ball;
@Override
public void handle(KeyEvent e) {
switch (e.getCode()) {
case ESCAPE:
Main.currentStage.setScene(Main.menuScene);
break;
case UP:
break;
case LEFT:
pika2MoveLeft = true;
break;
case RIGHT:
pika2MoveRight = true;
break;
case T:
break;
case F:
pika1MoveLeft = true;
break;
case H:
pika1MoveRight = true;
break;
}
move();
}
public void released(KeyEvent r) {
switch (r.getCode()) {
case LEFT:
pika2MoveLeft = false;
break;
case RIGHT:
pika2MoveRight = false;
break;
case F:
pika1MoveLeft = false;
break;
case H:
pika1MoveRight = false;
break;
}
}
public void move() {
if(pika1MoveLeft && pika1.getLayoutX()>=0)
pika1.setLayoutX(pika1.getLayoutX()-10);
if(pika1MoveRight && pika1.getLayoutX()<=440 )
pika1.setLayoutX(pika1.getLayoutX()+10);
if(pika2MoveLeft && pika2.getLayoutX()>600)
pika2.setLayoutX(pika2.getLayoutX()-10);
if(pika2MoveRight && pika2.getLayoutX()<1050)
pika2.setLayoutX(pika2.getLayoutX()+10);
}
}
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
public class VolleyController implements EventHandler<KeyEvent> {
double pika1LocationY = 556;
double pika2LocationY = 556;
double pika1LocationX = 0;
double pika2LocationX = 1050;
boolean pika2MoveLeft = false;
boolean pika2MoveRight = false;
boolean pika1MoveLeft = false;
boolean pika1MoveRight = false;
@FXML
ImageView pika1,pika2,ball;
//this gives me a syntax error about getScene(), but the following did not
Main.currentStage.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
switch (e.getCode()) {
case ESCAPE:
Main.currentStage.setScene(Main.menuScene);
break;
case UP:
break;
case LEFT:
pika2MoveLeft = true;
break;
case RIGHT:
pika2MoveRight = true;
break;
case T:
break;
case F:
pika1MoveLeft = true;
break;
case H:
pika1MoveRight = true;
break;
}
}}); //this told me to delete tokens
//this did not give me a syntax error
Main.currentStage.getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent r) {
switch (r.getCode()) {
case LEFT:
pika2MoveLeft = false;
break;
case RIGHT:
pika2MoveRight = false;
break;
case F:
pika1MoveLeft = false;
break;
case H:
pika1MoveRight = false;
break;
}
}
});
AnimationTimer timer=new AnimationTimer() {
@Override
public void handle(long now)
{
int pika1dx=0, pika2dx=0;
if(pika1MoveLeft) pika1dx-=10;
if(pika1MoveRight) pika1dx+=10;
if(pika2MoveLeft) pika2dx-=10;
if(pika2MoveLeft) pika2dx-=10;
PikaMoveBy(pika1dx,pika2dx);
}
};
timer.start();
}
public void PikaMoveBy(int pika1dx,int pika2dx)
{
if(pika1dx==0 || pika2dx==0) return;
final double pika1cx=pika1.getBoundsInLocal().getWidth()/2;
final double pika2cx=pika2.getBoundsInLocal().getWidth()/2;
double pika1x=pika1cx+pika1.getLayoutX()+pika1dx;
double pika2x=pika2cx+pika2.getLayoutX()+pika2dx;
PikaMoveTo(pika1x, pika2x);
}
public void PikaMoveTo(double pika1x, double pika2x)
{
final double pika1cx=pika1.getBoundsInLocal().getWidth()/2;
final double pika2cx=pika2.getBoundsInLocal().getWidth()/2;
if(pika1x-pika1cx>=0 && pika1x+pika1cx<450 && pika2x-pika2cx>600 && pika2x+pika2cx<1050)
{
pika1.relocate(pika1x-pika1cx, pika1_lct_y);
pika2.relocate(pika2x-pika2cx, pika2_lct_y);
}
}
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
public static Stage currentStage;
public static Scene menuScene;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
currentStage=primaryStage;
Parent root=FXMLLoader.load(getClass().getResource("Menu.fxml"));
Scene MenuScene = new Scene(root);
currentStage.setScene(MenuScene); //use setScene() to switch the scene
currentStage.setTitle("PikaVolley");
currentStage.show();
}
}
要使按键手和AnimationTimer正常工作,
请使用简单的FXML(Volley.fxml
):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<VBox spacing="10.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.VolleyController">
<children>
<Label alignment="CENTER" contentDisplay="CENTER" prefHeight="17.0" prefWidth="248.0" text="Press Start.Use Arows to set direction" />
<Pane prefHeight="250.0" prefWidth="250.0">
<children>
<ImageView fx:id="ball" fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true" />
</children>
</Pane>
<Button fx:id="startBtn" mnemonicParsing="false" onAction="#start" text="Start" />
</children>
</VBox>
及其控制器(见注释):
import javafx.animation.AnimationTimer;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
public class VolleyController implements EventHandler<KeyEvent> {
//always use publicly available resources when posting
private static final String BALL = "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/32x32/Circle_Red.png";
boolean moveRight = false, moveLeft = false, moveUp = false, moveDown = false;
private static final int DX = 1, DY = 1;
@FXML
ImageView ball;
@FXML
Button startBtn;
@FXML
void initialize(){
ball.setImage(new Image(BALL)); //initialize image view
}
@FXML
void start(){
ball.getScene().setOnKeyPressed(this); //add Key press and release handlers to scene
ball.getScene().setOnKeyReleased(this);
//construct and invoke AnimationTimer
AnimationTimer timer = new AnimationTimer(){
@Override
public void handle(long now) {
move(); //repeatedly invoke move
}
};
timer.start();
startBtn.setDisable(true);
}
@Override
public void handle(KeyEvent e) {
moveRight = false; moveLeft = false; moveUp = false; moveDown = false;
//change movement directions based on key events
switch (e.getCode()) {
case UP:
moveUp = true;
break;
case LEFT:
moveLeft = true;
break;
case RIGHT:
moveRight = true;
break;
case DOWN:
moveDown = true;
break;
}
}
//move if any of the direction control booleans is true
private void move() {
if(moveLeft) {
ball.setLayoutX(ball.getLayoutX()-DX);
}else if(moveRight) {
ball.setLayoutX(ball.getLayoutX()+DX);
}else if(moveDown) {
ball.setLayoutY(ball.getLayoutY()+DY);
}else if(moveUp) {
ball.setLayoutY(ball.getLayoutY()-DY);
}
}
}
测试它使用 :
public class Main extends Application {
@Override
public void start(Stage currentStage) throws Exception {
Parent root=FXMLLoader.load(getClass().getResource("Volley.fxml"));
currentStage.setScene(new Scene(root));
currentStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
在过去的两天里,我一直在学习React,我在理解URL参数方面遇到了困难。 假设我想要一个路由。路线的定义如下: 现在我希望在另一个文件中定义的对象能够使用值。我该怎么做?我已经找到了关于路由url参数的教程,但没有一个解释如何实现这一点。 下面是我的视图现在的样子: 在哪里可以获得详细信息中的?我试过: 但是,未定义。
我试图使用maven plugin增强来自另一个Jar的实体类,不幸的是,我没有找到正确的方法。 所以我的问题是:为了能够在构建时增强来自外部Jar的类,我需要配置什么?
问题内容: 我是一个初学者,现在我想用java启动GUI应用程序。我开始阅读一些有关FX的书籍,但并未在JDK11上编译..我是否需要使用jdk8还是有什么办法可以在jdk11上完成? 问题答案: JavaFX已脱离JDK11(Oracle的官方JDK和OpenJDK)的捆绑。为了将JavaFX与JDK11结合使用,您必须下载独立的JavaFX11运行时。
问题内容: 我想编写一个非常简单的Java 3D编辑器(用于实验)。我了解JavaFX的基本用法,并且了解足够的OpenGL知识。但是我所有的OpenGL经验都是来自使用C / C ++。 我可以在JavaFx应用程序中制作“画布”并在其上映射OpenGL视口吗? 问题答案: 在内部,JavaFX可以将OpenGL用作渲染管道,因此需要在两者之间进行一些集成以避免冲突。 JavaFX中的OpenG
jaywalker(代理)状态图 运行时屏幕截图 在第一张图片(主要),我有一个简单的行人模型,其中jaywalker(行人代理)移动通过2个道路交叉口。最初,所有乱穿马路的代理都处于“行走”状态&颜色为黄色(图2),但每当一些代理靠近另一个代理时(靠近意味着乱穿马路的代理表示中所示的三角形内),它们就会向它们发送“Hi”信息并进行社交。如果某人被社会化了,那么他们就从“行者”状态移动到“社会化”
我有两个API,一个是授权,另一个是创建交易。当用户授权生成访问令牌时。然后我们传递生成的令牌和用户名来创建事务。 我希望这个功能测试能够使用JMeter实现自动化。因此,为此,我有用户.csv文件,其中包含用户名和密码以及另外两个CSV作为创建交易1.csv,创建交易2.csv其中这两个CSV包含记录。因此,我希望用户 1 读取创建事务 1.csv和用户 2 读取创建事务 2.csv 任何想法,