2017-09-11 2 views
1

Ich bin gerade in der Schule, wo wir beauftragt wurden, eine Lösung zum Schreiben mit nur einem Knopf auf der Tastatur zu erfinden. Die Hauptaufgabe besteht darin, einen Bericht darüber zu schreiben, aber es erfordert auch, einen Prototyp zu erstellen. Dort stecke ich fest. Ich habe ein JavaFX mit allen Tasten von a-å (norwegische Buchstaben) gemacht, und der Plan ist, eine zufällige Taste auszuwählen (sagen Sie die g-Taste auf der Tastatur) und für jeden Push wird es zum nächsten Buchstaben bewegt. Mit einem Doppelklick auf den Button sollte der Brief in ein Textfeld gedruckt werden, und der nächste Klick geht zum nächsten Buchstaben in der Zeile. Auf diese Weise sollten Sie in der Lage sein, einfache Textnachrichten zu schreiben.Schreiben mit einem Knopf

Ich bin jetzt wirklich fest, wie man die "G-Taste" von den verschiedenen Tasten wechselt, und wie man es in das Textfeld ausdruckt. Auch ich bin ziemlich neu in der Programmierung und JavaFX und entschuldige mich für jede dumme Frage. Auch nicht sicher, ob JavaFX der einfachste Weg ist, dies zu tun, sondern es zu wählen, weil ich es am besten kenne.

Mein Code so weit: sample.fxml:

<GridPane fx:controller="sample.Controller" 
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> 
      <TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/> 
    <HBox spacing="10" alignment="bottom_right" 
      GridPane.columnIndex="1" GridPane.rowIndex="2"> 
     <Button text="A" fx:id="pushed" onAction="#write"/> 
     <Button text="B" /> 
     <Button text="C"/> 
     <Button text="D"/> 
     <Button text="E"/> 
    </HBox> 
    <HBox spacing="10" alignment="bottom_right" 
      GridPane.columnIndex="1" GridPane.rowIndex="3"> 
     <Button text="F"/> 
     <Button text="G"/> 
     <Button text="H"/> 
     <Button text="I"/> 
     <Button text="J"/> 
     <Button text="K"/> 
    </HBox> 
    <HBox spacing="10" alignment="bottom_right" 
      GridPane.columnIndex="1" GridPane.rowIndex="4"></HBox> 
    <HBox spacing="10" alignment="bottom_right" 
      GridPane.columnIndex="1" GridPane.rowIndex="5"> 
     <Button text="R"/> 
     <Button text="S"/> 
     <Button text="T"/> 
     <Button text="U"/> 
     <Button text="V"/> 
     <Button text="X"/> 
    </HBox> 
    <HBox spacing="10" alignment="bottom_right" 
      GridPane.columnIndex="1" GridPane.rowIndex="6"> 
     <Button text="Y"/> 
     <Button text="Z"/> 
     <Button text="Æ"/> 
     <Button text="Ø"/> 
     <Button text="Å"/> 
    </HBox> 
    <HBox spacing="10" alignment="bottom_right" 
      GridPane.columnIndex="1" GridPane.rowIndex="7"> 
     <Button text="Space"/> 
     <Button text="."/> 
    </HBox> 
</GridPane> 

Controller.java:

package sample; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 

public class Controller { 

    public void write(ActionEvent event){ 

    } 
} 

Main.java:

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root, 300, 275)); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Sie können Ihre Aufgabe sofort vereinfachen, indem Sie 'ToggleButton' anstelle von normalen verwenden. –

+0

Als Tastatureingabe machen Sie 1 "any key" Taste, sagen Sie mit id "anykey", mit 'setOnMouseClicked' können Sie das MouseEvent bekommen und ist' getClickCount'. Jetzt können Sie doppelte Klicks erkennen. Die Tasten könnten als Ausgabe verwendet werden: welche Taste würde beim Doppelklick genommen werden. Umschaltknöpfe (oder sogar Radioknöpfe) könnten verwendet werden. –

Antwort

0

Hier ist ein Beispiel-App können Sie Spiel mit. Ich implementierte BACKSPACE, TAB, ENTER usw. nicht. Ich prüfte auch nicht die APP, um zu sehen, ob ich richtig behandelte, den Zeichenzyklus neu zu starten, nachdem ich alle Zeichen durchlaufen hatte. Dies sollte ein guter Ausgangspunkt sein. In dieser App habe ich die Änderung des Charakters mit einem einzigen Klick codiert und Text per Doppelklick an TextField angehängt. Wie erkennen Doppelklick kam von @ JamesD Antwort here.

import java.util.ArrayList; 
import java.util.List; 
import javafx.animation.PauseTransition; 
import javafx.application.Application; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextArea; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

/** 
* 
* @author blj0011 
*/ 
public class OneButtonWriter extends Application { 

    final static String ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789;[email protected]#$%^&*()[email protected]#$%^&*()_+[]\\{}|;':\",./<>?"; 
    final static String[] ACTION_KEYS = {"TAB", "ENTER"}; 

    List<String> keys = new ArrayList();//Holds each key 

    int currentKey = 0; 

    @Override 
    public void start(Stage primaryStage) { 
     loadKeys();//Add all keys from ALPHABETS and ACTION_KEYS to keys arralist as individual keys. 

     TextArea textArea = new TextArea(); 

     Button button = new Button(); 

     //Code from Jame_D answer on double click 
     Duration maxTimeBetweenSequentialClicks = Duration.millis(500); 

     PauseTransition clickTimer = new PauseTransition(maxTimeBetweenSequentialClicks); 
     final IntegerProperty sequentialClickCount = new SimpleIntegerProperty(0); 
     clickTimer.setOnFinished(event -> { 
      int count = sequentialClickCount.get(); 
      if (count == 1) 
      { 
       System.out.println("Single click"); 
       textArea.appendText(button.getText());//if single click append text to textarea 
      } 
      if (count == 2) 
      { 
       System.out.println("Double click"); 
       currentKey++;//if double click increment currentKey 
       if(currentKey == keys.size())//If currentkey equal the keys size set current key back to A or index zero ***I HAVE NOT TESTED THIS*** 
       { 
        currentKey = 0; 
       } 

       button.setText(keys.get(currentKey)); 
      } 
      if (count == 3) System.out.println("Triple click"); 
      if (count > 3) System.out.println("Multiple click: "+count); 
      sequentialClickCount.set(0); 
     }); 


     button.setPrefSize(100, 100); 
     button.setText(keys.get(currentKey)); 
     button.setOnMouseClicked(event -> {    
      sequentialClickCount.set(sequentialClickCount.get()+1); 
      clickTimer.playFromStart(); 

     }); 

     VBox vbox = new VBox(); 
     vbox.getChildren().add(textArea); 
     vbox.getChildren().add(new StackPane(button)); 

     StackPane root = new StackPane(); 
     root.getChildren().add(vbox); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    private void loadKeys() 
    { 
     for(int i = 0; i < ALPHABETS.length(); i++) 
     { 
      keys.add(Character.toString(ALPHABETS.charAt(i))); 
     } 

     for(String actionKey : ACTION_KEYS) 
     { 
      keys.add(actionKey); 
     } 
    } 

} 
+0

Danke, das wird sehr helfen! –