Skip to content

Commit c5a7de9

Browse files
authored
Merge pull request #2 from ithsjava25/feature/message-input
Feature/message input
2 parents a998140 + 6543c26 commit c5a7de9

File tree

4 files changed

+114
-4
lines changed

4 files changed

+114
-4
lines changed

src/main/java/com/example/HelloController.java

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.example;
22
import javafx.event.ActionEvent;
33
import javafx.fxml.FXML;
4-
import javafx.scene.control.Label;
5-
import javafx.scene.control.ListView;
4+
import javafx.geometry.Insets;
5+
import javafx.scene.control.*;
6+
import javafx.scene.layout.HBox;
67

78
/**
89
* Controller layer: mediates between the view (FXML) and the model.
@@ -15,16 +16,71 @@ public class HelloController {
1516
@FXML
1617
private Label messageLabel;
1718

19+
@FXML
20+
private TextField messageField;
21+
1822
@FXML
1923
private void initialize() {
2024
if (messageLabel != null) {
2125
messageLabel.setText(model.getGreeting());
2226
}
2327
messageView.setItems(model.getMessages());
2428

29+
messageView.setCellFactory(list -> new ListCell<>() {
30+
private final Label messageLabel = new Label();
31+
private final HBox bubble = new HBox(messageLabel);
32+
{
33+
bubble.setPadding(new Insets(5, 10, 5, 10));
34+
bubble.setMaxWidth(200);
35+
messageLabel.setWrapText(true);
36+
bubble.getStyleClass().add("chat-bubble");
37+
}
38+
39+
@Override
40+
protected void updateItem(NtfyMessageDto item, boolean empty) {
41+
super.updateItem(item, empty);
42+
if (empty || item == null) {
43+
setGraphic(null);
44+
} else {
45+
// Format tid + text
46+
java.time.LocalTime time = java.time.Instant.ofEpochSecond(item.time())
47+
.atZone(java.time.ZoneId.systemDefault())
48+
.toLocalTime();
49+
String formattedTime = time.format(java.time.format.DateTimeFormatter.ofPattern("HH:mm"));
50+
51+
messageLabel.setText(formattedTime + "\n" + item.message());
52+
setGraphic(bubble);
53+
}
54+
}
55+
});
56+
57+
model.messageToSendProperty().bind(messageField.textProperty());
58+
2559
}
2660

2761
public void sendMessage(ActionEvent actionEvent) {
62+
String message = messageField.getText();
63+
if(message == null || message.isBlank()){
64+
showTemporaryAlert("You must write something before sending!");
65+
return;
66+
}
67+
2868
model.sendMessage();
69+
messageField.clear();
70+
}
71+
72+
private void showTemporaryAlert(String alertMessage) {
73+
Alert alert = new Alert(Alert.AlertType.WARNING);
74+
alert.setHeaderText(null);
75+
alert.setContentText(alertMessage);
76+
alert.initOwner(messageField.getScene().getWindow());
77+
78+
alert.show();
79+
80+
new Thread(() -> {
81+
try {
82+
Thread.sleep(2000);
83+
} catch (InterruptedException e) {}
84+
}).start();
2985
}
3086
}

src/main/java/com/example/HelloFX.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public void start(Stage stage) throws Exception {
1212
FXMLLoader fxmlLoader = new FXMLLoader(HelloFX.class.getResource("hello-view.fxml"));
1313
Parent root = fxmlLoader.load();
1414
Scene scene = new Scene(root, 640, 480);
15+
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
1516
stage.setTitle("Chatt Client");
1617
stage.setScene(scene);
1718
stage.show();

src/main/resources/com/example/hello-view.fxml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,20 @@
33
<?import javafx.scene.control.*?>
44
<?import javafx.scene.layout.*?>
55

6-
<VBox alignment="CENTER" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.HelloController">
6+
<?import javafx.geometry.Insets?>
7+
<VBox alignment="CENTER" stylesheets="@style.css" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.HelloController">
78

89
<Label fx:id="messageLabel" text="Adams Chat Client" />
9-
<Button onAction="#sendMessage" prefHeight="25.0" prefWidth="115.0" text="Send message" />
1010
<ListView fx:id="messageView" />
1111

12+
13+
<HBox alignment="CENTER_RIGHT" spacing="5" prefHeight="40" maxWidth="600">
14+
<VBox.margin>
15+
<Insets top="10" left="10" right="10" bottom="10" />
16+
</VBox.margin>
17+
18+
<TextField fx:id="messageField" prefHeight="40" promptText="Write something here.." HBox.hgrow="ALWAYS" />
19+
<Button onAction="#sendMessage" prefHeight="40" prefWidth="80" text="Send" />
20+
</HBox>
21+
1222
</VBox>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
.list-view {
2+
-fx-control-inner-background: white;
3+
-fx-control-inner-background-alt: white;
4+
-fx-background-color: white;
5+
-fx-selection-bar: transparent;
6+
-fx-selection-bar-non-focused: transparent;
7+
-fx-border-color: transparent;
8+
}
9+
.list-cell {
10+
-fx-background-color: #060312;
11+
-fx-padding: 5 10 5 10;
12+
}
13+
.chat-bubble {
14+
-fx-background-color: linear-gradient(to bottom right, #a922b5, #3d11ed);
15+
-fx-background-radius: 15;
16+
-fx-padding: 10;
17+
-fx-text-fill: white;
18+
}
19+
.chat-bubble .label {
20+
-fx-text-fill: white;
21+
}
22+
23+
.button {
24+
-fx-background-color: linear-gradient(to bottom right, #6366f1, #4f46e5);
25+
-fx-background-radius: 5;
26+
-fx-text-fill: white;
27+
-fx-font-size: 12px;
28+
-fx-font-weight: bold;
29+
-fx-padding: 8 24 8 24;
30+
-fx-cursor: hand;/
31+
-fx-border-color: transparent;
32+
-fx-effect: dropshadow(gaussian, rgba(0,0,0,0.25), 8, 0, 0, 3);
33+
-fx-transition: all 0.3s ease;
34+
}
35+
36+
.button:hover {
37+
-fx-background-color: linear-gradient(to bottom right, #7c3aed, #4338ca);
38+
}
39+
40+
.button:pressed {
41+
-fx-background-color: linear-gradient(to bottom right, #4338ca, #312e81);
42+
-fx-translate-y: 2;
43+
}

0 commit comments

Comments
 (0)