我有一个“驱动程序”文件和我正在处理的项目的源文件。在我的驱动程序文件中,向我添加一个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();
}
}
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());