JavaFX mini Taschenrechner!

Eine Frage hätte ich noch. Wie ermittelt man am besten die Layoutmanager? Ist das Übung?
Hier mal ein Beispiel:
12295

Wie könnte solch ein Programm aufgebaut sein?
Hätte jetzt First Name bist Nickname in GridPane also Zeile Spalte unterteilt. doch was macht man dann mit dem Display Format?
Und den Email Teil keine Ahnung rechts die Buttons vielleicht in eine HBox gepackt?

Gibt es da vielleicht eine Faustregel?
LG
 
Am Einfachsten ist es, alle Layouts zu kennen und dann ein Mock-up (oder Vorführmodell) am Reißbrett zu erstellen. :D

Da Du das Mock-up schon hast, sollte das Layout eigentlich daraus ableitbar sein...
 
Wie ermittelt man am besten die Layoutmanager? Ist das Übung?
Ein gutes Layout ist nicht ganz trivial, wie Du ja schon festgestellt hast. Die Wahl der "LayoutManager" hängt dann in erster Linie vom ... Layout ab :)

Hätte jetzt First Name bist Nickname in GridPane also Zeile Spalte unterteilt. doch was macht man dann mit dem Display Format?
GridPane hört sich gut an. Was das "Display format" betrifft: die add-Methode gibt es auch mit colspan...
 
Meinst du das Verbinden von Zeilen und Spalten.
Ja. https://docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/GridPane.html#add-javafx.scene.Node-int-int-int-int-

Dann könnte man ja alles in GridPane machen
Vieles.

Das finde ich überhaupt nicht leicht
Ich habe ja geschrieben, dass man ein gutes Layout nicht aus dem Ärmel schüttelt. Das gilt zumindest für etwas komplexere UIs.

Nicht umsonst gibt es Style Guidelines, in denen mehr oder weniger genau beschrieben wird, wie die Oberfläche aussehen sollte. Siehe z. B. https://docs.microsoft.com/en-us/windows/win32/uxguide/vis-layout. Das soll jetzt aber nicht als Referenz gelten, sondern nur zeigen, dass dahinter durchaus einiges an Hirnschmalz stecken kann.
 
Das mit dem Zusammenschmieden versuch ich später mal :)
Dann werde ich diese Oberfläche mal noch versuchen zusammen zu bauen.

Jetzt hätte ich noch eine Frage zum Taschenrechner. Ich möchte gerne noch ein Menü oben rein bauen.
Der Code dazu ist dieser:
Java:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class MenuDemo extends Application {

    @Override
    public void start(Stage stage) {

        // Create MenuBar
        MenuBar menuBar = new MenuBar();
       
        // Create menus
        Menu fileMenu = new Menu("File");
        Menu editMenu = new Menu("Edit");
        Menu helpMenu = new Menu("Help");
       
        // Create MenuItems
        MenuItem newItem = new MenuItem("New");
        MenuItem openFileItem = new MenuItem("Open File");
        MenuItem exitItem = new MenuItem("Exit");
       
        MenuItem copyItem = new MenuItem("Copy");
        MenuItem pasteItem = new MenuItem("Paste");
       
        // Add menuItems to the Menus
        fileMenu.getItems().addAll(newItem, openFileItem, exitItem);
        editMenu.getItems().addAll(copyItem, pasteItem);
       
        // Add Menus to the MenuBar
        menuBar.getMenus().addAll(fileMenu, editMenu, helpMenu);
       
        BorderPane root = new BorderPane();
        root.setTop(menuBar);
        Scene scene = new Scene(root, 350, 200);
       
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

}
Das Menü ist derzeit in einer BorerPane und der Rechner in in der GridPane.
Jetzt muss ich doch noch einen Layoutmanager nehmen und beide Panes drauf packen oder geht das irgendwie auch anders da es ja ein "Menu" ist!?

LG
 
Das scheint unter FX der richtige Weg zu sein, wobei in den Beispielen als Root-Container einfach eine VBox genommen wird.
 
Super geht :)
Doch wer soll sich bitte all die Methoden behalten! Verrückt so etwas :p

Java:
import java.util.*;
import java.util.function.BiFunction;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;

public class Taschenrechner extends Application {
    ComboBox<String> comboBox = new ComboBox<>();
    TextField zahl1 = new TextField();
    TextField zahl2 = new TextField();
    TextField ergebnis = new TextField();
    Map<String, BiFunction<Number, Number, Number>> binaryOperations = new HashMap<>();

    public void start(Stage primaryStage) {
        //Menu
        // Create MenuBar
        MenuBar menuBar = new MenuBar();
       // Create menus
        Menu fileMenu = new Menu("File");
        Menu editMenu = new Menu("Edit");
        Menu helpMenu = new Menu("Help");
        // Create MenuItems
        MenuItem newItem = new MenuItem("New");
        MenuItem openFileItem = new MenuItem("Open File");
        MenuItem exitItem = new MenuItem("Exit");
      
        MenuItem copyItem = new MenuItem("Copy");
        MenuItem pasteItem = new MenuItem("Paste");
        // Add menuItems to the Menus
        fileMenu.getItems().addAll(newItem, openFileItem, exitItem);
        editMenu.getItems().addAll(copyItem, pasteItem);
        // Add Menus to the MenuBar
        menuBar.getMenus().addAll(fileMenu, editMenu, helpMenu);
      
        BorderPane root = new BorderPane();
        root.setTop(menuBar);

        //Taschenrechner
        binaryOperations.put("+", (a,b) -> a.doubleValue() + b.doubleValue());
        binaryOperations.put("-", (a,b) -> a.doubleValue() - b.doubleValue());
        binaryOperations.put("*", (a,b) -> a.doubleValue() * b.doubleValue());
        binaryOperations.put("/", (a,b) -> a.doubleValue() / b.doubleValue());
        comboBox.setItems( (ObservableList<String>) FXCollections.observableArrayList("+","-","*","/"));
        comboBox.setValue("+");
        ergebnis.setDisable(true);
        Button button2 = new Button("Berechne");
        button2.setOnAction( (ActionEvent event) -> ergebnis.setText(berechne()));

        GridPane gridPane = new GridPane();
        gridPane.add(new Label("Zahl1"), 0, 0);
        gridPane.add(new Label("Zahl2"), 2, 0);
        gridPane.add(new Label("Ergebnis"), 4, 0);
        gridPane.add(zahl1, 0,1);
        gridPane.add(zahl2, 2,1);
        gridPane.add(ergebnis, 4,1);
        gridPane.add(comboBox, 1, 1);
        gridPane.add(button2, 3, 1);
        root.setCenter(gridPane);
        Scene scene = new Scene(root, 700, 80);
        primaryStage.setTitle("Mein Taschenrechner");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    private String berechne() {
         BiFunction<Number, Number, Number> b = binaryOperations.get(comboBox.getValue());
            if (b != null) {
                return b.apply(Double.parseDouble(zahl1.getText()), Double.parseDouble(zahl2.getText()))
                        .toString();
            }
            return "";           
    }
    
    public static void main(String[] args) {
        Application.launch(args);       
    }

}

Eine aller Letzte Frage zu diesem Programm hätte ich jetzt noch (sind eigentlich zwei) :D
Wie bekomme ich jetzt wenn ich das Fenster groß mache die Fenster mit groß? und wie bleibt das Fenster auf der Minimal größe von 700 * 80 Pixel? Denn wenn ich es klein Ziehe geht es bis ich gar nichts mehr sehe :(

LG
 
Das mit den Fenstern meine ich heißt property binding?
Wenn ich das Fenster auf Maximal umschalte sollen die Fenster sich auch vergrößern :D sieht zwar komisch aus aber das ist erst einmal egal :)

LG
 
Meinst Du, dass die Felder sich vergrößern sollen, wenn das Fenster vergrößert wird? Also etwas wie
Java:
ColumnConstraints grow = new ColumnConstraints();
grow.setHgrow(Priority.ALWAYS);
ColumnConstraints normal = new ColumnConstraints();
gridPane.getColumnConstraints().addAll(grow, normal, grow, normal, grow);
 
:D Genau das meinte ich :)

Ich verstehe es zwar nicht! doch das liegt vor allem daran das es soooo viele Methoden und Objekte in JavaFX gibt! Das ist zu viel.

Ein kleines Problem habe ich noch. Was ich meinte mit dem Minimieren ist z. B. wie im FireFox. Wenn ich diesen klein mache hat er eine gewisse Größe. Wie stellt man diese Größe ein? Und er hat eine Minimieren Minimum Größe denn wenn ich Ihn nun an den Ecken klein ziehe geht das bis zu einem gewissen Punkt. Bei meinem Taschenrechner geht das so lange bis alles verschwunden ist.
Lässt sich scher erklären!

LG
 
doch das liegt vor allem daran das es soooo viele Methoden und Objekte in JavaFX gibt!
Man kann im GridPane alles mögliche einstellen. Das liegt vor allem daran, dass Du nicht in die Doku schaust :)

Was ich meinte mit dem Minimieren ist z. B. wie im FireFox. Wenn ich diesen klein mache hat er eine gewisse Größe. Wie stellt man diese Größe ein?
Mit "klein machen" meinst Du meinst vermutlich das "Wiederherstellen", nachdem Du zuvor das Fenster maximiert hast. Das dürfte einfach die Größe sein, die das Fenster vor dem Maximieren hatte.

Ansonsten schaust Du Dir am besten auch mal https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html#setMinHeight-double- & Co. an.
 
Nochmals danke für deine Mühe :) @mihe7
Ja in die Doku schaue ich echt wenig :( mir fehlen dann auch sehr oft die zusammen hänge :(

Kennst du ein paar Bücher dazu? Ich hab mal schnell gesucht und vielleicht ist ja das hier ganz gut dafür?

Denn das Thema ist ja sehr schön und wird heute ja eh gebraucht :)

lg
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben