私はデモのために、以下の基本的なGUIがあります。JavaFX - ユーザーがあるノードから別のノードにマウスをドラッグしたときに通知しますか?
を、私は、以下の機能を実現しようとしているが、私は私が試みられてきたすべての道を使い果たしました。
ユーザーは、ImageViewの者のいずれかをクリックして、ユーザーがのが マウスボタンを放すまで、周りのユーザーのカーソルを次の 矢印を作成します左にすることができます。プログラムは
User just clicked from R to B
を印刷し 、ユーザーはレッドImageView
をクリックし、ブルーImageView
の上にドラッグしてから行かせた場合(矢印は、Xを起動し、Yは、彼がクリックされたと終了のxところ、yは彼のマウスが現在あるところ です)ユーザーはレッド
ImageView
をクリックし、マウスを手放すが、異なるImageView
上 なかった場合、プログラムはUser just clicked from R but did not target a different ImageView
を印刷します。
ImageView
をクリックすると矢印が表示され、2番目が消えるとマウスが消えます。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import java.util.HashMap;
public class Test extends Application
{
public static int HEIGHT = 500, WIDTH = 600;
@Override
public void start(Stage primaryStage) throws Exception
{
ImageView blue = new ImageView(new Image("blue.png")),
red = new ImageView(new Image("red.png")),
dark = new ImageView(new Image("dark.png"));
// Final array as to bypass the `final` requirement of event handler inner classes.
final ImageView[] hoveredOver = new ImageView[1];
final Line[] linePtr = new Line[1];
linePtr[0] = new Line();
linePtr[0].setStrokeWidth(10);
HashMap<ImageView, Character> lookup = new HashMap<ImageView, Character>(3)
{{
put(blue, 'B');
put(red, 'R');
put(dark, 'D');
}};
for (ImageView i : new ImageView[] { blue, red, dark })
{
i.setFitWidth(150);
i.setFitHeight(150);
// Set the anchor points of the click and display the arrow.
i.setOnMousePressed(e -> {
linePtr[0].setStartX(e.getX());
linePtr[0].setStartY(e.getY());
linePtr[0].setVisible(true);
});
// Move the arrow as the mouse moves.
i.setOnMouseDragged(e -> {
linePtr[0].setEndX(e.getX());
linePtr[0].setEndY(e.getY());
});
i.setOnMouseReleased(e -> {
// Not null means that the user WAS actually just now hovering over an imageview.
if (hoveredOver[0] != null)
System.out.printf("The user clicked from %c to %c!\n", lookup.get(i), lookup.get(hoveredOver[0]));
// Null means the user is not over an ImageView.
else
System.out.printf("The user initially clicked %c but did not drag to another Imageview.\n", lookup.get(i));
linePtr[0].setVisible(false);
});
// If the user enters ANY of the ImageViews,
// Set a variable so that the drag release listener
// can know about it!
i.setOnMouseDragOver(e -> hoveredOver[0] = i);
i.setOnMouseDragExited(e -> hoveredOver[0] = null);
}
blue.setX(400);
blue.setY(250);
red.setY(300);
red.setX(50);
/*
In this example I'm using a Pane but in my real program
I might be using a VBOX HBOX etc where I cannot freely move stuff around as I'd like.
This makes things extremely difficult and without using a 'Pane'
I don't know how this can even be done. Suggestions?
*/
Pane pneRoot = new Pane(blue, red, dark, linePtr[0]);
Scene scene = new Scene(pneRoot, WIDTH, HEIGHT);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
}
これが私の最高の試みであったと言っても近くにありません。それは行(矢印ではなく、理想的には私が矢印を曲線のように動かすように、this example image from a popular video gameのように動かす)が、私のニーズに合っていません。しかし、ImageViewを「ドラッグ」している間は、それを検出できません。
これを行うより良い方法はありますか?私は、私はそれ以上にダウンしているコードを単純にすることはできないように感じる。MUST別の方法がある。
それはスキルの天井がJavaであるか高で私の心を吹きます。私とこの記事の検索を終了するかもしれない他の人のためにこのコードブロックにコメントを追加できますか?例えば、 'Path'と' MooveTo'は何ですか?ここでは何が使われていますか? 'Source.addListener((obs、oldSource、newSource)'は 'ChangeListener'ですか?' Source'のポインタが 'NamedDrag ... 'によって変更されると、そのリスナーがトリガされますか?私の 'Pane'は' Pane'ではなく 'GridPane'や' VBox'などですか?デフォルトで 'NamedDrag ...'を呼びますが、何もありません?ありがとうございます – Hatefiend
@Hatefiend私が知る限り、管理されたレイアウトの唯一の違いは、 'arrowHead'と' arrowLine'に対して 'setManaged(false)'を呼び出さなければならないということです。 –