diff --git a/panel_admin_sae/.gitignore b/panel_admin_sae/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..f68d1099657e34d4e7a68aadc730b3ecad84667d --- /dev/null +++ b/panel_admin_sae/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/panel_admin_sae/.idea/.gitignore b/panel_admin_sae/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4 --- /dev/null +++ b/panel_admin_sae/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/panel_admin_sae/.idea/misc.xml b/panel_admin_sae/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..69ace3f6affaf674f40a55887f3d6f3564afd626 --- /dev/null +++ b/panel_admin_sae/.idea/misc.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK"> + <output url="file://$PROJECT_DIR$/out" /> + </component> +</project> \ No newline at end of file diff --git a/panel_admin_sae/.idea/modules.xml b/panel_admin_sae/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..f543d59591e04717af8e1feb4f2a53a9f40bf7fd --- /dev/null +++ b/panel_admin_sae/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/panel_admin_sae.iml" filepath="$PROJECT_DIR$/panel_admin_sae.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/panel_admin_sae/.idea/uiDesigner.xml b/panel_admin_sae/.idea/uiDesigner.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b63946d5b31084bbb7dda418ceb3d75eb686373 --- /dev/null +++ b/panel_admin_sae/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Palette2"> + <group name="Swing"> + <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" /> + </item> + <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" /> + </item> + <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true"> + <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" /> + <initial-values> + <property name="text" value="Button" /> + </initial-values> + </item> + <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="RadioButton" /> + </initial-values> + </item> + <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="CheckBox" /> + </initial-values> + </item> + <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="Label" /> + </initial-values> + </item> + <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> + <preferred-size width="200" height="200" /> + </default-constraints> + </item> + <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> + <preferred-size width="200" height="200" /> + </default-constraints> + </item> + <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" /> + </item> + <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1"> + <preferred-size width="-1" height="20" /> + </default-constraints> + </item> + <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" /> + </item> + <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" /> + </item> + </group> + </component> +</project> \ No newline at end of file diff --git a/panel_admin_sae/mysql-connector-java-8.0.30.jar b/panel_admin_sae/mysql-connector-java-8.0.30.jar new file mode 100644 index 0000000000000000000000000000000000000000..92ebe1b54ab3d9ed6d38851fb91186e6d25009ab Binary files /dev/null and b/panel_admin_sae/mysql-connector-java-8.0.30.jar differ diff --git a/panel_admin_sae/panel_admin_sae.iml b/panel_admin_sae/panel_admin_sae.iml new file mode 100644 index 0000000000000000000000000000000000000000..e9d852cf27d6a6d2841269a168d48eaf9b2c218f --- /dev/null +++ b/panel_admin_sae/panel_admin_sae.iml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/mysql-connector-java-8.0.30.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + </component> +</module> \ No newline at end of file diff --git a/panel_admin_sae/src/src/Panel.java b/panel_admin_sae/src/src/Panel.java new file mode 100644 index 0000000000000000000000000000000000000000..1682cea1bfad32ff7c6a6ca0dc27f2074a52a18b --- /dev/null +++ b/panel_admin_sae/src/src/Panel.java @@ -0,0 +1,347 @@ +package src; + +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableRowSorter; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.sql.*; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Comparator; +import java.util.Date; + +public class Panel implements ActionListener { + + private Connection dbConnection; + private JFrame frame; + private JTabbedPane tabbedPane; + private JPanel competitionsPanel; + private JTextField lieuField, horaireField, placesField; + private JButton addButton, deleteButton, updateButton, loginButton; + private JTable competitionsTable; + private DefaultTableModel competitionsTableModel; + private JTextField loginField; + private JPasswordField passwordField; + private boolean isLoggedIn = false; + + public Panel(Connection connection) { + this.dbConnection = connection; + + frame = new JFrame("Panel"); + frame.setSize(800, 600); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + try { + UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); + } catch (Exception e) { + e.printStackTrace(); + } + + tabbedPane = new JTabbedPane(); + + // Add the login panel + JPanel loginPanel = createLoginPanel(); + tabbedPane.addTab("Login", loginPanel); + + // Add the competitions panel but set it as disabled initially + competitionsPanel = createCompetitionsPanel(); + tabbedPane.addTab("Gérer Compétitions", competitionsPanel); + tabbedPane.setEnabledAt(1, false); + + frame.add(tabbedPane); + frame.setVisible(true); + } + + private JPanel createLoginPanel() { + JPanel panel = new JPanel(new GridBagLayout()); + panel.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50)); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(15, 15, 15, 15); + gbc.fill = GridBagConstraints.HORIZONTAL; + + JLabel titleLabel = new JLabel("Connexion"); + titleLabel.setFont(new Font("Arial", Font.BOLD, 36)); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.gridwidth = 2; + panel.add(titleLabel, gbc); + + JLabel usernameLabel = new JLabel("Nom d'utilisateur:"); + usernameLabel.setFont(new Font("Arial", Font.PLAIN, 20)); + gbc.gridy = 1; + gbc.gridwidth = 1; + panel.add(usernameLabel, gbc); + + loginField = new JTextField(25); + loginField.setFont(new Font("Arial", Font.PLAIN, 20)); + gbc.gridx = 1; + panel.add(loginField, gbc); + + JLabel passwordLabel = new JLabel("Mot de passe:"); + passwordLabel.setFont(new Font("Arial", Font.PLAIN, 20)); + gbc.gridx = 0; + gbc.gridy = 2; + panel.add(passwordLabel, gbc); + + passwordField = new JPasswordField(25); + passwordField.setFont(new Font("Arial", Font.PLAIN, 20)); + gbc.gridx = 1; + panel.add(passwordField, gbc); + + loginButton = new JButton("Connexion"); + loginButton.setFont(new Font("Arial", Font.BOLD, 20)); + loginButton.addActionListener(this); + gbc.gridx = 0; + gbc.gridy = 3; + gbc.gridwidth = 2; + panel.add(loginButton, gbc); + + passwordField.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + loginButton.doClick(); + } + }); + + return panel; + } + + private JPanel createCompetitionsPanel() { + JPanel panel = new JPanel(new BorderLayout()); + + competitionsTableModel = new DefaultTableModel(); + competitionsTableModel.addColumn("ID"); + competitionsTableModel.addColumn("Lieu"); + competitionsTableModel.addColumn("Horaire"); + competitionsTableModel.addColumn("Places Disponibles"); + competitionsTable = new JTable(competitionsTableModel); + + TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<>(competitionsTableModel); + competitionsTable.setRowSorter(sorter); + + sorter.setComparator(0, Comparator.<Object, Integer>comparing(o -> (Integer) o)); + sorter.setComparator(3, Comparator.<Object, Integer>comparing(o -> (Integer) o)); + + JScrollPane scrollPane = new JScrollPane(competitionsTable); + panel.add(scrollPane, BorderLayout.CENTER); + + JPanel inputPanel = new JPanel(new GridLayout(4, 2, 10, 10)); // Ajout de l'espacement entre les composants + inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Ajout de marges + + inputPanel.add(new JLabel("Lieu:")); + lieuField = new JTextField(); + inputPanel.add(lieuField); + + inputPanel.add(new JLabel("Horaire (yyyy-MM-dd HH:mm:ss):")); + horaireField = new JTextField(); + inputPanel.add(horaireField); + + inputPanel.add(new JLabel("Places Disponibles:")); + placesField = new JTextField(); + inputPanel.add(placesField); + + addButton = new JButton("Ajouter"); + deleteButton = new JButton("Supprimer"); + updateButton = new JButton("Modifier"); + + addButton.addActionListener(this); + deleteButton.addActionListener(this); + updateButton.addActionListener(this); + + JPanel buttonPanel = new JPanel(new GridLayout(1, 3, 10, 0)); // Ajout de l'espacement entre les boutons + buttonPanel.add(addButton); + buttonPanel.add(deleteButton); + buttonPanel.add(updateButton); + + inputPanel.add(buttonPanel); + + panel.add(inputPanel, BorderLayout.SOUTH); + + if (isLoggedIn) { + loadCompetitionsData(); + } + + return panel; + } + + private void loadCompetitionsData() { + competitionsTableModel.setRowCount(0); + try { + Statement stmt = dbConnection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM competitions"); + while (rs.next()) { + int competitionID = rs.getInt("CompetitionID"); + String lieu = rs.getString("Lieu"); + Timestamp horaire = rs.getTimestamp("Horaire"); + int placesDisponibles = rs.getInt("PlacesDisponibles"); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String formattedDate = sdf.format(horaire); + + competitionsTableModel.addRow(new Object[]{competitionID, lieu, formattedDate, placesDisponibles}); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource() == loginButton) { + authenticateUser(); + } else if (e.getSource() == addButton && isLoggedIn) { + addCompetition(); + } else if (e.getSource() == deleteButton && isLoggedIn) { + deleteCompetition(); + } else if (e.getSource() == updateButton && isLoggedIn) { + updateCompetition(); + } + } + + private void authenticateUser() { + String enteredLogin = loginField.getText(); + char[] enteredPasswordChars = passwordField.getPassword(); + String enteredPassword = new String(enteredPasswordChars); + + try { + PreparedStatement stmt = dbConnection.prepareStatement("SELECT * FROM admin WHERE login = ? AND password = ?"); + stmt.setString(1, enteredLogin); + stmt.setString(2, enteredPassword); + + ResultSet rs = stmt.executeQuery(); + + if (rs.next()) { + isLoggedIn = true; + tabbedPane.setEnabledAt(1, true); + tabbedPane.setSelectedComponent(competitionsPanel); + loadCompetitionsData(); + tabbedPane.remove(0); + } else { + JOptionPane.showMessageDialog(frame, "Invalid login credentials.", "Authentication Failed", JOptionPane.ERROR_MESSAGE); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } + } + + private void addCompetition() { + try { + String lieu = lieuField.getText(); + String horaireStr = horaireField.getText(); + String placesStr = placesField.getText(); + + if (!placesStr.isEmpty()) { + try { + int placesDisponibles = Integer.parseInt(placesStr); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date parsedDate = sdf.parse(horaireStr); + Timestamp horaire = new Timestamp(parsedDate.getTime()); + + PreparedStatement stmt = dbConnection.prepareStatement("INSERT INTO competitions (Lieu, Horaire, PlacesDisponibles) VALUES (?, ?, ?)"); + stmt.setString(1, lieu); + stmt.setTimestamp(2, horaire); + stmt.setInt(3, placesDisponibles); + + int rowsAffected = stmt.executeUpdate(); + + if (rowsAffected > 0) { + JOptionPane.showMessageDialog(frame, "Compétition ajoutée avec succès.", "Succès", JOptionPane.INFORMATION_MESSAGE); + loadCompetitionsData(); + } else { + JOptionPane.showMessageDialog(frame, "Erreur lors de l'ajout de la compétition.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + + } catch (NumberFormatException ex) { + JOptionPane.showMessageDialog(frame, "Veuillez entrer un nombre valide pour les places disponibles.", "Erreur", JOptionPane.ERROR_MESSAGE); + } catch (ParseException ex) { + JOptionPane.showMessageDialog(frame, "Format de date invalide.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + } else { + JOptionPane.showMessageDialog(frame, "Veuillez entrer un nombre pour les places disponibles.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } + } + + private void deleteCompetition() { + int selectedRow = competitionsTable.getSelectedRow(); + if (selectedRow != -1) { + int competitionID = (int) competitionsTableModel.getValueAt(selectedRow, 0); + + try { + PreparedStatement stmt = dbConnection.prepareStatement("DELETE FROM competitions WHERE CompetitionID = ?"); + stmt.setInt(1, competitionID); + + int rowsAffected = stmt.executeUpdate(); + + if (rowsAffected > 0) { + JOptionPane.showMessageDialog(frame, "Compétition supprimée avec succès.", "Succès", JOptionPane.INFORMATION_MESSAGE); + loadCompetitionsData(); + } else { + JOptionPane.showMessageDialog(frame, "Erreur lors de la suppression de la compétition.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } + } else { + JOptionPane.showMessageDialog(frame, "Veuillez sélectionner une compétition à supprimer.", "Sélection requise", JOptionPane.WARNING_MESSAGE); + } + } + + private void updateCompetition() { + int selectedRow = competitionsTable.getSelectedRow(); + if (selectedRow != -1) { + try { + int competitionID = (int) competitionsTableModel.getValueAt(selectedRow, 0); + String lieu = lieuField.getText(); + String horaireStr = horaireField.getText(); + String placesStr = placesField.getText(); + + if (!horaireStr.isEmpty()) { // Ajout de la vérification de non-nullité et non-vacuité + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date parsedDate = sdf.parse(horaireStr); + Timestamp horaire = new Timestamp(parsedDate.getTime()); + + int placesDisponibles = Integer.parseInt(placesStr); + + PreparedStatement stmt = dbConnection.prepareStatement("UPDATE competitions SET Lieu = ?, Horaire = ?, PlacesDisponibles = ? WHERE CompetitionID = ?"); + stmt.setString(1, lieu); + stmt.setTimestamp(2, horaire); + stmt.setInt(3, placesDisponibles); + stmt.setInt(4, competitionID); + + int rowsAffected = stmt.executeUpdate(); + + if (rowsAffected > 0) { + JOptionPane.showMessageDialog(frame, "Compétition mise à jour avec succès.", "Succès", JOptionPane.INFORMATION_MESSAGE); + loadCompetitionsData(); + } else { + JOptionPane.showMessageDialog(frame, "Erreur lors de la mise à jour de la compétition.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + } else { + JOptionPane.showMessageDialog(frame, "Veuillez entrer une date valide.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + } catch (SQLException | ParseException | NumberFormatException ex) { + ex.printStackTrace(); + JOptionPane.showMessageDialog(frame, "Erreur lors de la mise à jour de la compétition.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + } else { + JOptionPane.showMessageDialog(frame, "Veuillez sélectionner une compétition à mettre à jour.", "Sélection requise", JOptionPane.WARNING_MESSAGE); + } + } + + + public static void main(String[] args) { + try { + Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", ""); + new Panel(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + } +}