1 回答

TA貢獻(xiàn)1829條經(jīng)驗 獲得超7個贊
如果你只檢查lineButton被內(nèi)選擇MOUSE_CLICKED(這是一個壓然后釋放的手勢,順便)處理。在這個處理程序中添加一個MOUSE_PRESSED處理程序,然后在該處理程序中添加一個MOUSE_DRAGGED處理程序。您不檢查或處理程序中l(wèi)ineButton是否選擇了。MOUSE_PRESSEDMOUSE_DRAGGED
這一切意味著,在處理程序中的if條件MOUSE_CLICKED評估為真后,您將擁有獨立于您的處理程序運行的MOUSE_PRESSEDandMOUSE_DRAGGED處理程序?,F(xiàn)在,每當(dāng)您按下任何鼠標(biāo)按鈕時,它都會創(chuàng)建一個并將其添加到父級。然后新添加的處理程序?qū)⒏?MOUSE_CLICKEDLineMOUSE_DRAGGEDLine
在某種程度上,您很幸運,您使用的是onXXX屬性而不是addEventHandler. 這些屬性EventHandler在設(shè)置時替換舊的。如果那沒有發(fā)生(例如使用addEventHandler),您將有很多(每次多一個)EventHandlers 繪圖Lines。
你只需要注冊所有適當(dāng)?shù)腅ventHandler小號一次,做他們的邏輯里。
這是一個小例子:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.ToolBar;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class Main extends Application {
private ToggleGroup toggleGroup;
private ToggleButton lineBtn;
private Group group;
private Line currentLine;
@Override
public void start(Stage primaryStage) {
toggleGroup = new ToggleGroup();
lineBtn = new ToggleButton("Line");
ToggleButton noneBtn = new ToggleButton("None");
toggleGroup.getToggles().addAll(lineBtn, noneBtn);
toggleGroup.selectToggle(noneBtn);
group = new Group();
BorderPane root = new BorderPane(new Pane(group), new ToolBar(lineBtn, noneBtn), null, null, null);
root.getCenter().setOnMousePressed(this::handleMousePressed);
root.getCenter().setOnMouseDragged(this::handleMouseDragged);
root.getCenter().setOnMouseReleased(this::handleMouseReleased);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.setTitle("Draw Shape Example");
primaryStage.show();
}
private void handleMousePressed(MouseEvent event) {
if (lineBtn.equals(toggleGroup.getSelectedToggle())
&& event.getButton() == MouseButton.PRIMARY) {
currentLine = new Line(event.getX(), event.getY(), event.getX(), event.getY());
group.getChildren().add(currentLine);
}
}
private void handleMouseDragged(MouseEvent event) {
if (currentLine != null) {
currentLine.setEndX(event.getX());
currentLine.setEndY(event.getY());
}
}
private void handleMouseReleased(MouseEvent event) {
if (currentLine != null
&& currentLine.getStartX() == currentLine.getEndX()
&& currentLine.getStartY() == currentLine.getEndY()) {
// The line has no length, remove it
group.getChildren().remove(currentLine);
}
currentLine = null;
}
}
添加回答
舉報