第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaFX,MouseEvent 問題

JavaFX,MouseEvent 問題

藍(lán)山帝景 2021-12-30 16:33:42
我目前正在制作一個繪畫應(yīng)用程序并創(chuàng)建了幾個正在運行的工具,但是在嘗試創(chuàng)建“繪制直線”工具時遇到了問題所以我基本上畫了一條從 A 點到 B 點的線并且它起作用了,這條線在那里,但是,當(dāng)我切換我的其他工具(繪制圓形、矩形等)時,形狀與直線同時繪制,盡管“畫線”按鈕被關(guān)閉。下面的代碼將允許您繪制直線,您可以嘗試打開和關(guān)閉不同的按鈕,當(dāng)您將光標(biāo)拖過窗格時仍會繪制直線。任何人都知道我犯了什么樣的錯誤,以及任何可能的修復(fù)和/或替代解決方案?(事件處理程序在那里,以便我可以選擇繪制的形狀,如果需要,稍后更改它們,此代碼是我的繪畫應(yīng)用程序的精簡版本)public class DrawLine extends Application {@Overridepublic void start(Stage primaryStage) {    ToggleButton lineButton  =   new    ToggleButton    ("Draw Line");    ToggleButton Button      =   new    ToggleButton    ("Button with no function");    BorderPane pane = new BorderPane();    ToolBar toolbar = new ToolBar();    Scene scene = new Scene(pane, 1200, 800);    pane.setLeft(toolbar);    toolbar.getItems().addAll(lineButton, Button);    // Draw Line    scene.addEventHandler(MouseEvent.MOUSE_CLICKED, me -> {         if(lineButton.isSelected() & me.getButton().equals(MouseButton.PRIMARY) ) {             scene.setOnMousePressed(event -> {                Line line = new Line();                line.setStartX(event.getX());                line.setStartY(event.getY());                    scene.setOnMouseDragged(e->{                        line.setEndX(e.getX());                        line.setEndY(e.getY());                        });                    pane.getChildren().add(line);                });        }    });    primaryStage.setTitle("Paint App");     primaryStage.setScene(scene);           primaryStage.show();                 }public static void main(String[] args) {    launch();}}
查看完整描述

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;

  }


}



查看完整回答
反對 回復(fù) 2021-12-30
  • 1 回答
  • 0 關(guān)注
  • 261 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號