JavaFX Langes drücken eines Buttons

iliano

Mitglied
Hallo liebe Leute.

Ich habe ein kleines Problem was ich nicht lösen kann.
Suche schon seit Tagen vergeblich nach einer Lösung, aber ich werde leider nicht fündig.

Ich habe ein Button und wenn ich ein Mal drauf drücke soll ein anderes Fenster geöffnet werden. Das ist auch kein Problem.
Ich möchte aber noch bei den gleichen Button, wenn ich ihn lange gedrückt halte, ein anderes Fenster geöffnet werden, wo der User den Button Text ändern kann von einen TextFeld aus.

Diese Funktion für ein langes drücken eines Button finde ich nicht.

Habe schon mit OnMouseClicked, OnMousePressed probiert, aber alles leider ohne Erfolg.
Mit dem Doppelklick des Buttons habe ich auch probiert, aber das ist nicht praktisch denn mit dem Doppelklick öffnen sich beide Fenster.

Ich wäre sehr Dankbar über Ideen und Hilfe von euch.
 
Wie wäre es mit folgendem simplen Ansatz:

Bei OnMousePressed merkst du dir die aktuelle Zeit
Bei OnMouseReleased bildest du die Differenz von der aktuellen Zeit zu der gemerkten und entscheidest so ob der Button lange genug gedrückt wurde.
 
Sehr gute Ansatz muss ich sagen!

Nur leider habe ich es so nicht hinbekommen mit der Programmierung. So habe ich ein neues Fenster erstellt, mit TextFields. Von diesen Textfield wird dann der Button Text gesetzt und ausgelesen.

Vielen lieben Dank.
 
Nur leider habe ich es so nicht hinbekommen mit der Programmierung. So habe ich ein neues Fenster erstellt, mit TextFields. Von diesen Textfield wird dann der Button Text gesetzt und ausgelesen.
Wäre noch gut zu wissen wie du es machen wolltest...
Hier mal eine mögliche Variante:
App.java:
Java:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        try {
            final FXMLLoader loader = new FXMLLoader(getClass().getResource("MainGui.fxml"));
            final Parent root = (Parent) loader.load();
            primaryStage.setTitle("Hauptfenster");
            Scene scene = new Scene(root, 740.0, 430.0);
            primaryStage.setScene(scene);
            primaryStage.setResizable(false);
            primaryStage.show();

        } catch(Exception e) {
            System.err.println(e.getMessage());
        }      
    }
}
MainGui.fxml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.GridPane?>

<GridPane fx:id="gridPane" prefHeight="366.0" prefWidth="341.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="MainGuiController">
   <rowConstraints>
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
   </rowConstraints>
   <columnConstraints>
      <ColumnConstraints />
      <ColumnConstraints />
   </columnConstraints>
   <children>
      <Label text="Ich bin das Hauptfenster..." />
      <Button fx:id="openWindowButton" text="Fenster öffnen" GridPane.rowIndex="2" />
      <Button fx:id="exitButton" text="Schliessen" onAction="#handleExitButtonEvent" GridPane.columnIndex="1" GridPane.rowIndex="2" />
   </children>
</GridPane>
Window1.fxml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.GridPane?>

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="307.0" prefWidth="298.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Window1Controller">
   <children>
      <Label text="Ich bin das 1.Fenster... hier gibts nix zu tun..." />
      <Button fx:id="exitButton" text="Schliessen" onAction="#handleExitButtonEvent"/>
   </children>
</VBox>
Window2.fxml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<VBox prefHeight="320.0" prefWidth="287.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="Window2Controller">
   <children>
         <Label text="Name vom Button: "/>
      <TextField fx:id="textField" />
      <Button fx:id="exitButton" text="Schliessen" onAction="#handleExitButtonEvent"/>
   </children>
</VBox>
MainGuiController.java
Java:
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class MainGuiController implements Initializable {
   @FXML
   private Button exitButton;
   @FXML
   private Button openWindowButton;
  
   @FXML
   private GridPane gridPane;
  
   private static long DIFFERENCE = 1000;   // [ms] Dieser Wert entscheidet, ob Window 1 oder Window 2 geöffnent wird
  
   private long mousePressed = 0;
   private long mouseReleased = 0;

   @Override
   public void initialize(URL location, ResourceBundle resources) {
     openWindowButton.onMousePressedProperty().set(new EventHandler<MouseEvent>() {
       @Override
       public void handle(MouseEvent arg0) {
         mousePressed = System.currentTimeMillis();
       }
     });
    
     openWindowButton.onMouseReleasedProperty().set(new EventHandler<MouseEvent>() {
       @Override
       public void handle(MouseEvent arg0) {
         mouseReleased = System.currentTimeMillis();
         if((mouseReleased - mousePressed) < DIFFERENCE)
           openWindow1();
         else
           openWindow2();
       }
     });
   }
    
   /**
    * Method to close the mainwindow
    */
   @FXML
   protected void handleExitButtonEvent(ActionEvent event) {
     Stage stage = (Stage) exitButton.getScene().getWindow();
     stage.close();
    
   }
  
   /**
    * Method to open window 1 as dialog
    */
   private void openWindow1() {
     FXMLLoader loader = new FXMLLoader(MainGuiController.class.getResource("Window1.fxml"));
     Stage dialogStage = new Stage();
     Parent root;
     try {
       root = (Parent) loader.load();
       // falls im Window1 ein Property binding von einem Controll vom MainGuiController gemacht werden muss..
       //Window1Controller window1Controller = (Window1Controller)loader.getController();
       Scene scene = new Scene(root);
       dialogStage.setResizable(false);
       dialogStage.setScene(scene);
       dialogStage.setTitle("Window 1");
       dialogStage.initModality(Modality.APPLICATION_MODAL);  
       dialogStage.show();
       dialogStage.setResizable(false);      
     } catch (IOException e) {
       System.out.println(e.getMessage());
     }
   }
  
   /**
    * Method to open window 2 as dialog
    */
   private void openWindow2() {
     FXMLLoader loader = new FXMLLoader(MainGuiController.class.getResource("Window2.fxml"));
     Stage dialogStage = new Stage();
     Parent root;
     try {
       root = (Parent) loader.load();
       Window2Controller window2Controller = (Window2Controller)loader.getController();
       Scene scene = new Scene(root);
       dialogStage.setResizable(false);
       dialogStage.setScene(scene);
       dialogStage.setTitle("Window 2");
       dialogStage.initModality(Modality.APPLICATION_MODAL);  
       dialogStage.show();
       dialogStage.setResizable(false);
window2Controller.getButtonNameProperty().bindBidirectional(openWindowButton.textProperty());
      
     } catch (IOException e) {
       System.out.println(e.getMessage());
     }
   }
}
Window1Controller.java:
Java:
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public class Window1Controller implements Initializable {
    @FXML
    private Button exitButton;
  
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
      
    }
  
    /**
     * Method to close this window
     * @param event
     */
    @FXML
    protected void handleExitButtonEvent(ActionEvent event) {
        Stage stage = (Stage) exitButton.getScene().getWindow();
        stage.close();
    }  
}
Window2Controller.java:
Java:
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class Window2Controller implements Initializable {
    @FXML
    private Button exitButton;
    @FXML
    private TextField textField;
  
    private StringProperty buttonNameProperty = new SimpleStringProperty();
  
    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        textField.textProperty().bindBidirectional(buttonNameProperty);
    }

    /**
     * Method to close this window
     * @param event
     */
    @FXML
    protected void handleExitButtonEvent(ActionEvent event) {
        Stage stage = (Stage) exitButton.getScene().getWindow();
        stage.close();
      
    }

    /**
     * @return the buttonName
     */
    public StringProperty getButtonNameProperty() {
        return buttonNameProperty;
    }

    /**
     * @param buttonName the buttonName to set
     */
    public void setButtonNameProperty(StringProperty value) {
        buttonNameProperty = value;
    }
}
Entscheidend dabei ist, dass auf den Button selbst kein onAction-Evenet ausgelöst wird, sondern auf onMousePressedProperty() und openWindowButton.onMouseReleasedProperty() ein Event ausgelöst wird...
 

Zurück
Oben