Skip to content

Commit 3273fe4

Browse files
committed
Adapt demo to the new architecture
1 parent fe2eca6 commit 3273fe4

File tree

7 files changed

+85
-46
lines changed

7 files changed

+85
-46
lines changed

patternfx-demo/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<properties>
1717
<maven.deploy.skip>true</maven.deploy.skip>
1818
<!-- JavaFX 19 has a bug: it shows a system notification on Ubuntu when a dialog is closed -->
19-
<javafx.version>25</javafx.version>
19+
<javafx.version>18</javafx.version>
2020
</properties>
2121

2222
<dependencies>

patternfx-demo/src/main/java/com/techsenger/patternfx/demo/PersonDialogView.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.techsenger.patternfx.demo;
1818

1919
import com.techsenger.patternfx.core.AbstractParentView;
20-
import com.techsenger.patternfx.demo.model.Person;
2120
import javafx.beans.binding.Bindings;
2221
import javafx.beans.property.BooleanProperty;
2322
import javafx.event.ActionEvent;
@@ -57,16 +56,16 @@ public class PersonDialogView extends AbstractParentView<PersonDialogViewModel,
5756
private final HBox hBox = new HBox(firstNameLabel, firstNameTextField, lastNameLabel, lastNameTextField,
5857
ageLabel, ageTextField);
5958

60-
private final Dialog<Person> dialog = new Dialog<>();
59+
private final Dialog<ButtonType> dialog = new Dialog<>();
6160

6261
private Button okButton;
6362

64-
public PersonDialogView(Stage stage, PersonDialogViewModel viewModel) {
63+
public PersonDialogView(PersonDialogViewModel viewModel, Stage stage) {
6564
super(viewModel);
6665
this.stage = stage;
6766
}
6867

69-
public Dialog<Person> getDialog() {
68+
protected Dialog<ButtonType> getDialog() {
7069
return this.dialog;
7170
}
7271

@@ -86,13 +85,6 @@ protected void build() {
8685
dialog.initModality(Modality.WINDOW_MODAL);
8786
dialog.getDialogPane().setContent(hBox);
8887
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.CANCEL, ButtonType.OK);
89-
dialog.setResultConverter(dialogButton -> {
90-
if (dialogButton == ButtonType.OK) {
91-
return getViewModel().createPerson();
92-
}
93-
return null;
94-
});
95-
9688
this.okButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK);
9789
}
9890

@@ -114,7 +106,7 @@ protected void bind() {
114106
protected void addHandlers() {
115107
super.addHandlers();
116108
okButton.addEventFilter(ActionEvent.ACTION, event -> {
117-
if (!getViewModel().isPersonValid()) {
109+
if (!getViewModel().addNewPerson()) {
118110
event.consume();
119111
}
120112
});

patternfx-demo/src/main/java/com/techsenger/patternfx/demo/PersonDialogViewModel.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.techsenger.patternfx.core.AbstractParentViewModel;
2020
import com.techsenger.patternfx.core.ParentMediator;
2121
import com.techsenger.patternfx.demo.model.Person;
22+
import java.util.function.Consumer;
2223
import javafx.beans.property.BooleanProperty;
2324
import javafx.beans.property.ObjectProperty;
2425
import javafx.beans.property.SimpleBooleanProperty;
@@ -46,6 +47,12 @@ public class PersonDialogViewModel extends AbstractParentViewModel<ParentMediato
4647

4748
private final BooleanProperty ageValid = new SimpleBooleanProperty(true);
4849

50+
private final Consumer<Person> resultCallback;
51+
52+
public PersonDialogViewModel(Consumer<Person> resultCallback) {
53+
this.resultCallback = resultCallback;
54+
}
55+
4956
public String getFirstName() {
5057
return firstName.get();
5158
}
@@ -98,18 +105,22 @@ BooleanProperty ageValidProperty() {
98105
return ageValid;
99106
}
100107

101-
boolean isPersonValid() {
108+
boolean addNewPerson() {
109+
if (isPersonValid()) {
110+
var newPerson = new Person(getFirstName(), getLastName(), getAge());
111+
this.resultCallback.accept(newPerson);
112+
return true;
113+
}
114+
return false;
115+
}
116+
117+
private boolean isPersonValid() {
102118
firstNameValid.set(isFirstNameValid());
103119
lastNameValid.set(isLastNameValid());
104120
ageValid.set(isAgeValid());
105121
return firstNameValid.get() && lastNameValid.get() && ageValid.get();
106122
}
107123

108-
Person createPerson() {
109-
var newPerson = new Person(getFirstName(), getLastName(), getAge());
110-
return newPerson;
111-
}
112-
113124
private boolean isFirstNameValid() {
114125
var name = getFirstName();
115126
return name != null && !name.isBlank();

patternfx-demo/src/main/java/com/techsenger/patternfx/demo/PersonRegistryComponent.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@
2525
*/
2626
public class PersonRegistryComponent extends AbstractParentComponent<PersonRegistryView> {
2727

28+
private final class Mediator extends AbstractParentComponent.Mediator implements PersonRegistryMediator {
29+
30+
@Override
31+
public void openDialog(PersonDialogViewModel vm) {
32+
var dialogV = new PersonDialogView(vm, getView().getStage());
33+
var dialogC = new PersonDialogComponent(dialogV);
34+
dialogC.initialize();
35+
dialogC.getView().getDialog().showAndWait();
36+
dialogC.deinitialize();
37+
}
38+
}
39+
2840
public PersonRegistryComponent(PersonRegistryView view) {
2941
super(view);
3042
}
@@ -36,6 +48,6 @@ public ComponentName getName() {
3648

3749
@Override
3850
protected Mediator createMediator() {
39-
return new AbstractParentComponent.Mediator() { };
51+
return new Mediator();
4052
}
4153
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright 2024-2025 Pavel Castornii.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.techsenger.patternfx.demo;
18+
19+
import com.techsenger.patternfx.core.ParentMediator;
20+
21+
/**
22+
*
23+
* @author Pavel Castornii
24+
*/
25+
public interface PersonRegistryMediator extends ParentMediator {
26+
27+
void openDialog(PersonDialogViewModel dialog);
28+
}

patternfx-demo/src/main/java/com/techsenger/patternfx/demo/PersonRegistryView.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,12 @@ protected void bind() {
9898
protected void addHandlers() {
9999
super.addHandlers();
100100
var vm = getViewModel();
101-
addButton.setOnAction(e -> {
102-
var dialogVM = vm.createDialog();
103-
var dialogV = new PersonDialogView(stage, dialogVM);
104-
var dialogComponent = new PersonDialogComponent(dialogV);
105-
dialogComponent.initialize();
106-
107-
var jfxDialog = dialogV.getDialog();
108-
var result = jfxDialog.showAndWait();
109-
vm.add(result);
110-
111-
dialogComponent.deinitialize();
112-
});
101+
addButton.setOnAction(e -> vm.add());
113102
removeButton.setOnAction(e -> vm.remove());
114103
refreshButton.setOnAction(e -> vm.refresh());
115104
}
105+
106+
Stage getStage() {
107+
return stage;
108+
}
116109
}

patternfx-demo/src/main/java/com/techsenger/patternfx/demo/PersonRegistryViewModel.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818

1919
import com.techsenger.patternfx.core.AbstractParentViewModel;
2020
import com.techsenger.patternfx.core.ComponentState;
21-
import com.techsenger.patternfx.core.ParentMediator;
2221
import com.techsenger.patternfx.demo.model.Person;
2322
import com.techsenger.patternfx.demo.model.PersonService;
24-
import java.util.Optional;
23+
import java.util.Iterator;
2524
import javafx.beans.binding.Bindings;
2625
import javafx.beans.property.BooleanProperty;
2726
import javafx.beans.property.ObjectProperty;
@@ -38,7 +37,7 @@
3837
*
3938
* @author Pavel Castornii
4039
*/
41-
public class PersonRegistryViewModel extends AbstractParentViewModel<ParentMediator> {
40+
public class PersonRegistryViewModel extends AbstractParentViewModel<PersonRegistryMediator> {
4241

4342
private static final Logger logger = LoggerFactory.getLogger(PersonRegistryViewModel.class);
4443

@@ -84,10 +83,6 @@ ObjectProperty<Person> selectedPersonProperty() {
8483
return selectedPerson;
8584
}
8685

87-
PersonDialogViewModel createDialog() {
88-
return new PersonDialogViewModel();
89-
}
90-
9186
BooleanProperty removeDisabledProperty() {
9287
return this.removeDisabled;
9388
}
@@ -97,17 +92,25 @@ void refresh() {
9792
persons.addAll(service.readAll());
9893
}
9994

100-
void add(Optional<Person> person) {
101-
if (person.isPresent()) {
102-
var p = person.get();
103-
service.save(p);
104-
persons.add(p);
105-
}
95+
void add() {
96+
var dialogVM = new PersonDialogViewModel((p) -> add(p));
97+
getMediator().openDialog(dialogVM);
10698
}
10799

108100
void remove() {
109101
var id = selectedPerson.get().getId();
110102
service.delete(id);
111-
persons.removeIf(p -> p.getId().equals(id));
103+
for (Iterator<Person> it = persons.iterator(); it.hasNext();) {
104+
Person p = it.next();
105+
if (p.getId() == id) {
106+
it.remove();
107+
break;
108+
}
109+
}
110+
}
111+
112+
private void add(Person person) {
113+
service.save(person);
114+
persons.add(person);
112115
}
113116
}

0 commit comments

Comments
 (0)