Skip to content

Commit 3454d22

Browse files
committed
Add 'Counting the Number of Characters' GUI version
- Repackaged console and gui to keep both - Added the UML Diagram for GUI version
1 parent f47c92f commit 3454d22

File tree

12 files changed

+193
-4
lines changed

12 files changed

+193
-4
lines changed
160 KB
Loading

characters-count/build.gradle

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
plugins {
2-
id 'java'
2+
id 'application'
3+
id 'org.openjfx.javafxplugin' version '0.1.0'
34
}
45

56
repositories {
67
mavenCentral()
78
}
89

10+
javafx {
11+
version = "21"
12+
modules = [ 'javafx.controls' ]
13+
}
14+
15+
application {
16+
mainClass.set('com.craftsmanshipinsoftware.charscnt.gui.Main')
17+
}
18+
919
dependencies {
1020
testImplementation(libs.assertj.core)
1121
testImplementation(libs.junit.jupiter)

characters-count/src/main/java/com/craftsmanshipinsoftware/count/CharactersCounter.java renamed to characters-count/src/main/java/com/craftsmanshipinsoftware/charscnt/console/CharactersCounter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.craftsmanshipinsoftware.count;
1+
package com.craftsmanshipinsoftware.charscnt.console;
22

33
import java.io.InputStream;
44
import java.io.PrintStream;
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package com.craftsmanshipinsoftware.count;
1+
package com.craftsmanshipinsoftware.charscnt.console;
22

33
public class Main {
44

55
public static void main(String[] args) {
66
CharactersCounter charactersCounter = new CharactersCounter(System.in, System.out);
77
charactersCounter.displayCharactersCount();
88
}
9+
910
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.craftsmanshipinsoftware.charscnt.gui;
2+
3+
final class CharactersCount {
4+
5+
private final String input;
6+
7+
private CharactersCount(String input) {
8+
if (input == null || input.isBlank()) {
9+
throw new IllegalArgumentException("input must not be blank");
10+
}
11+
this.input = input;
12+
}
13+
14+
static CharactersCount of(String input) {
15+
return new CharactersCount(input);
16+
}
17+
18+
@Override
19+
public String toString() {
20+
return "%s has %d characters.".formatted(this.input, this.input.length());
21+
}
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.craftsmanshipinsoftware.charscnt.gui;
2+
3+
import javafx.application.Application;
4+
import javafx.scene.Scene;
5+
import javafx.stage.Stage;
6+
7+
public class CharactersCountApplication extends Application {
8+
9+
@Override
10+
public void start(Stage stage) {
11+
CharactersCountViewModel viewModel = new CharactersCountViewModel();
12+
CharactersCountView view = new CharactersCountView(viewModel);
13+
Scene scene = new Scene(view, 400, 200);
14+
stage.setTitle("Counting the Number of Characters");
15+
stage.setScene(scene);
16+
stage.show();
17+
}
18+
19+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.craftsmanshipinsoftware.charscnt.gui;
2+
3+
import javafx.geometry.Insets;
4+
import javafx.geometry.Pos;
5+
import javafx.scene.control.Label;
6+
import javafx.scene.control.TextField;
7+
import javafx.scene.layout.VBox;
8+
9+
final class CharactersCountView extends VBox {
10+
11+
private final TextField inputTextField = new TextField();
12+
13+
private final Label outputLabel = new Label();
14+
15+
private final CharactersCountViewModel viewModel;
16+
17+
CharactersCountView(CharactersCountViewModel viewModel) {
18+
this.viewModel = viewModel;
19+
createView();
20+
bindViewModel();
21+
}
22+
23+
private void createView() {
24+
setSpacing(10);
25+
setAlignment(Pos.CENTER);
26+
setPadding(new Insets(10, 20, 10, 20));
27+
this.getChildren().addAll(new Label("What is the input string?"), this.inputTextField, this.outputLabel);
28+
}
29+
30+
private void bindViewModel() {
31+
this.inputTextField.textProperty().bindBidirectional(this.viewModel.inputProperty());
32+
this.outputLabel.textProperty().bind(this.viewModel.outputProperty());
33+
this.viewModel.inputProperty().addListener((obs, ov, nv) -> this.viewModel.countInputCharacters());
34+
}
35+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.craftsmanshipinsoftware.charscnt.gui;
2+
3+
import javafx.beans.property.SimpleStringProperty;
4+
import javafx.beans.property.StringProperty;
5+
6+
final class CharactersCountViewModel {
7+
8+
private final StringProperty input = new SimpleStringProperty();
9+
10+
private final StringProperty output = new SimpleStringProperty();
11+
12+
StringProperty inputProperty() {
13+
return this.input;
14+
}
15+
16+
StringProperty outputProperty() {
17+
return this.output;
18+
}
19+
20+
void countInputCharacters() {
21+
String inputValue = this.input.getValue();
22+
if (inputValue == null || inputValue.isBlank()) {
23+
this.output.set("Please enter some input string.");
24+
} else {
25+
this.output.set(CharactersCount.of(inputValue).toString());
26+
}
27+
}
28+
29+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.craftsmanshipinsoftware.charscnt.gui;
2+
3+
import javafx.application.Application;
4+
5+
public class Main {
6+
7+
public static void main(String[] args) {
8+
Application.launch(CharactersCountApplication.class);
9+
}
10+
11+
}

characters-count/src/test/java/com/craftsmanshipinsoftware/count/CharactersCounterTests.java renamed to characters-count/src/test/java/com/craftsmanshipinsoftware/charscnt/console/CharactersCounterTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.craftsmanshipinsoftware.count;
1+
package com.craftsmanshipinsoftware.charscnt.console;
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

0 commit comments

Comments
 (0)