如何在两个文件Javafx项目上使用按键

问题描述 投票:0回答:1

我有一个“驱动程序”文件和我正在处理的项目的源文件。在我的驱动程序文件中,向我添加一个EventHandle阶段。

stage.addEventHandler(KeyEvent.KEY_TYPED, shape.getKeyHandler());

现在在我的源文件中,我尝试在我的源文件中定义函数“ getKeyHandler”。我在函数内部创建了一个新的EventHandler。然后创建一个事件处理程序,该事件处理程序将接受您按的任何键(R,G或B),并将屏幕上的圆圈/正方形更改为其相应的颜色。 (G =绿色,等等)

我遇到的问题是我不确定如何设置需要(KeyEvent.KEY_CLICKED)的EventHandler。我的另外两个EventHandlers从未在驱动程序文件中调用,因此我能够以this.addEventHandler开头,现在我在另一条船上。有人可以将我推向正确的方向。

源文件:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.scene.input.*;
import javafx.geometry.Point2D;

public class Multishape extends Group {
//Declaring variables here gives them greater scope

private Rectangle rectangle;
private Circle circle;
private Point2D prev;

public Multishape (double x, double y, double len){

  rectangle = new Rectangle((len*2), (len*2), Color.RED);
  rectangle.setX(x-len);
  rectangle.setY(y-len);
  rectangle.setStroke(Color.BLACK);
  rectangle.setStrokeWidth(1);

  circle = new Circle(len, Color.BLUE); 
  circle.setCenterX(x);
  circle.setCenterY(y);
  circle.setStroke(Color.BLACK);
  circle.setStrokeWidth(1);  

  this.getChildren().add(rectangle); 

  this.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent me) ->
  {
   if(me.getButton() == MouseButton.PRIMARY)
   {
     if(this.getChildren().get(0).equals(rectangle))
     {
        this.getChildren().set(0, circle);
     }
     else
     {
        this.getChildren().set(0, rectangle);
     }
   }      
  });

  prev = new Point2D(320, 240);
  this.addEventHandler(MouseEvent.MOUSE_DRAGGED, (MouseEvent me) ->
  {
  if(me.getButton() == MouseButton.SECONDARY)
  {
    if(this.getChildren().get(0).equals(rectangle))
    {
      rectangle.setX(prev.getX()-len);
      rectangle.setY(prev.getY()-len);
      circle.setCenterX(prev.getX());
      circle.setCenterY(prev.getY());
    }
    else
    {
      circle.setCenterX(prev.getX());
      circle.setCenterY(prev.getY());
      rectangle.setX(prev.getX()-len);
      rectangle.setY(prev.getY()-len);
    }
  } 
   prev = new Point2D(me.getX(), me.getY());  
  });

}

public EventHandler<KeyEvent> getKeyHandler(){
   EventHandler<KeyEvent> keyPressHandler = new 
EventHandler<KeyEvent>(){
      @Override
      public void handle(KeyEvent event){
      if(event.getCode() == KeyCode.R){
         circle.setFill(Color.RED);
         rectangle.setFill(Color.RED);
      }
      if(event.getCode() == KeyCode.G){
         circle.setFill(Color.GREEN);
         rectangle.setFill(Color.GREEN);  
      }
      if(event.getCode() == KeyCode.B){
         circle.setFill(Color.BLUE);
         rectangle.setFill(Color.BLUE);
      }


      }

   };
   return keyPressHandler;
}


}

驱动程序文件:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.input.KeyEvent;
import javafx.event.EventHandler;

public class MultishapeDriver extends Application
{
  public static void main(String[] args)
  {
    launch(args);
  }

  public void start(Stage stage)
  {
    stage.setTitle("Multishape lab");
    Group root = new Group();
    Multishape shape = new Multishape(320, 240, 40);

    root.getChildren().add(shape);
    stage.addEventHandler(KeyEvent.KEY_TYPED, 
shape.getKeyHandler());

    stage.setScene(new Scene(root, 640, 480));
    stage.show();
  }
}
javafx keyevent eventhandler stage
1个回答
0
投票

KeyEvent.code属性未为KEY_TYPED事件定义。您要么需要使用character属性

Color color = null;
switch(event.getCharacter().toLowerCase()) {
case "r":
    color = Color.RED;
break;
case "g":
    color = Color.LIME; // or green, but lime is #00ff00
    break;
case "b":
    color = Color.BLUE;
    break;
default:
    return;
}
circle.setFill(color);
rectangle.setFill(color);

或使用其他事件类型,例如KEY_PRESSED

stage.addEventHandler(KeyEvent.KEY_PRESSED, shape.getKeyHandler());
© www.soinside.com 2019 - 2024. All rights reserved.