Skip to content
Snippets Groups Projects
Commit 180ab6c1 authored by Jan Kožusznik's avatar Jan Kožusznik
Browse files

Initial commit

parents
Branches
No related merge requests found
**/target/
/target/
*/target/*
.classpath
.project
.settings
# Package Files #
*.jar
*.war
*.ear
*.iml
*.idea
\ No newline at end of file
pom.xml 0 → 100644
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>vsb-cs-java1</groupId>
<artifactId>lab01</artifactId>
<version>0.0.1-SNAPHOST</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>14</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc10 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc10</artifactId>
<version>19.8.0.0</version>
</dependency>
</dependencies>
</project>
module lab01 {
requires transitive javafx.controls;
requires javafx.fxml;
requires java.sql;
opens table_view to javafx.fxml;
exports table_view;
}
\ No newline at end of file
package table_view;
public interface JDBCDialect {
String getDriverClazzName();
String getDriverID();
String getCreateTable();
}
package table_view;
import javafx.beans.property.SimpleStringProperty;
public class Person {
private final Long id;
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
Person(String fName, String lName, String email) {
this(null, fName, lName, email);
}
Person(Long id, String fName, String lName, String email) {
this.id = id;
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
Person(Long id, Person p) {
this(id, p.getFirstName(), p.getLastName(), p.getEmail());
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
public Long getId() {
return id;
}
}
\ No newline at end of file
package table_view;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.LinkedList;
public class PersonDAO implements AutoCloseable{
private static final String INSERT_SQL = "INSERT INTO person(first_name, last_name, email) values (?,?,?)";
private Connection conn;
private final JDBCDialect dialect;
public PersonDAO(JDBCDialect dialect) {
this.dialect = dialect;
try {
Class.forName(dialect.getDriverClazzName());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
String url = dialect.getDriverID() + "://localhost/java1";
try {
conn = DriverManager.getConnection(url,"java1","java4ever");
constructTable();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void close() throws Exception {
checkConnection();
conn.close();
}
public Person insertPerson(Person p) {
checkConnection();
try (PreparedStatement ps = conn.prepareStatement(INSERT_SQL, Statement.RETURN_GENERATED_KEYS)){
ps.setString(1, p.getFirstName());
ps.setString(2, p.getLastName());
ps.setString(3, p.getEmail());
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
rs.next();
long id = rs.getLong(1);
return new Person(id, p);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public Collection<Person> getAll() {
checkConnection();
Collection<Person> result = new LinkedList<>();
try (Statement stm = conn.createStatement()){
stm.execute("SELECT id, first_name, last_name, email FROM person");
ResultSet resultSet = stm.getResultSet();
while(resultSet.next()) {
result.add(new Person(resultSet.getLong(1), resultSet.getString(2), resultSet.getString(3),resultSet.getString(4)));
}
return result;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public boolean updatePerson(Person p) {
checkConnection();
try (PreparedStatement ps = conn.prepareStatement("UPDATE person set first_name = ?, last_name = ?, email = ? WHERE id = ?")){
ps.setString(1, p.getFirstName());
ps.setString(2, p.getLastName());
ps.setString(3, p.getEmail());
ps.setLong(4, p.getId());
ps.executeUpdate();
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public boolean deletePerson(Person p) {
checkConnection();
try (PreparedStatement ps = conn.prepareStatement("DELETE FROM person WHERE id = ?")){
ps.setLong(1, p.getId());
ps.executeUpdate();
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
private void constructTable() throws SQLException {
try(Statement st = conn.createStatement()) {
st.execute(dialect.getCreateTable());
}
}
private void checkConnection() {
if (conn == null) {
throw new IllegalStateException("Connection is not opened");
}
}
}
package table_view;
public class PostgresqlJDBCDialect implements JDBCDialect{
@Override
public String getDriverClazzName() {
return "org.postgresql.Driver";
}
@Override
public String getDriverID() {
return "jdbc:postgresql";
}
@Override
public String getCreateTable() {
return "CREATE TABLE IF NOT EXISTS person(id SERIAL PRIMARY KEY, first_name varchar(64), last_name varchar(64), email varchar(64))";
}
}
package table_view;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
public class TableViewSample extends Application {
private TableView<Person> table = new TableView<Person>();
private final PersonDAO dao;
private final ObservableList<Person> data;
final HBox hb = new HBox();
private TextField addFirstName;
private TextField addLastName;
private TextField addEmail;
public static void main(String[] args) {
launch(args);
}
public TableViewSample() {
dao = new PersonDAO(new PostgresqlJDBCDialect());
data = FXCollections.observableArrayList(dao.getAll());
}
@SuppressWarnings("unchecked")
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(550);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn<Person,String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));
firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
firstNameCol.setOnEditCommit(this::handleOnEditCommitFirstName);
TableColumn<Person,String> lastNameCol = new TableColumn<>("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("lastName"));
lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
lastNameCol.setOnEditCommit(this::handleOnEditCommitLastName);
TableColumn<Person,String> emailCol = new TableColumn<>("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("email"));
emailCol.setCellFactory(TextFieldTableCell.forTableColumn());
emailCol.setOnEditCommit(this::handleOnEditCommitEmail);
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
addFirstName = new TextField();
addFirstName.setPromptText("First Name");
addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
addLastName = new TextField();
addLastName.setMaxWidth(lastNameCol.getPrefWidth());
addLastName.setPromptText("Last Name");
addEmail = new TextField();
addEmail.setMaxWidth(emailCol.getPrefWidth());
addEmail.setPromptText("Email");
final Button addButton = new Button("Add");
addButton.setOnAction(this::handleOnAdd);
hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
hb.setSpacing(3);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, hb);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
fillTable();
stage.show();
stage.setOnCloseRequest(this::exitProgram);
}
private void fillTable() {
}
private void handleOnAdd(ActionEvent e) {
Person p = new Person(addFirstName.getText(), addLastName.getText(), addEmail.getText());
p = dao.insertPerson(p);
data.add(p);
addFirstName.clear();
addLastName.clear();
addEmail.clear();
}
private void handleOnEditCommitFirstName(CellEditEvent<Person, String> t) {
Person p = t.getTableView().getItems().get(t.getTablePosition().getRow());
p.setFirstName(t.getNewValue());
dao.updatePerson(p);
}
private void handleOnEditCommitLastName(CellEditEvent<Person, String> t) {
Person p = t.getTableView().getItems().get(t.getTablePosition().getRow());
p.setLastName(t.getNewValue());
dao.updatePerson(p);
}
private void handleOnEditCommitEmail(CellEditEvent<Person, String> t) {
Person p = t.getTableView().getItems().get(t.getTablePosition().getRow());
p.setEmail(t.getNewValue());
dao.updatePerson(p);
}
private void exitProgram(WindowEvent evt) {
try {
dao.close();
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment