Java Swing — проблема с обновлением Jtable в реальном времени

#java #swing #jtable

#java #swing #jtable

Вопрос:

Я новичок в программировании, и это мой первый год обучения. Мы на самом деле изучаем Java, и у меня проблема, которую я не могу найти. Попробовал несколько вещей, которые я нашел в stackoverflow, но ничего не сработало, потому что я думаю, что не знаю, что я делаю.

Все работает, вставка, удаление и выберите все, чтобы отобразить Jtable. И то, чего я не понимаю, это то, что когда я выполняю вставку, таблица обновляется, но когда я удаляю, ничего не обновляется в реальном времени. Это работает, когда я закрываю и снова открываю.

 
import java.awt.*;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class EcranContacts extends JFrame implements ActionListener {

    private JPanel contentPane;
    private JLabel lblNewLabel;
    private JComboBox comboBox;
    private JLabel lblNewLabel_1;
    private JTextField textField;
    private JTextField textField_1;
    private JLabel lblNewLabel_1_1;
    private JTextField textField_2;
    private JLabel lblNewLabel_1_2;
    private JTextField textField_3;
    private JLabel lblNewLabel_1_3;
    private JTable table;
    private JButton btnNewButton;
    private JButton btnNewButton1;
    private JButton btnDelete;
    private JPanel panelAnnuaire;


    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    EcranContacts frame = new EcranContacts();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public EcranContacts() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 501);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.add(getLblNewLabel());
        contentPane.add(getComboBox());
        contentPane.add(getLblNewLabel_1());
        contentPane.add(getTextField());
        contentPane.add(getTextField_1());
        contentPane.add(getLblNewLabel_1_1());
        contentPane.add(getTextField_2());
        contentPane.add(getLblNewLabel_1_2());
        contentPane.add(getTextField_3());
        contentPane.add(getLblNewLabel_1_3());
        //  contentPane.add(getTable());
        contentPane.add(getBtnNewButton());
        contentPane.add(getBtnNewButton1());
        contentPane.add(getBtnDelete());
    }

    private JLabel getLblNewLabel() {
        if (lblNewLabel == null) {
            lblNewLabel = new JLabel("Choisissez une option :");
            lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 15));
            lblNewLabel.setBounds(45, 49, 192, 19);
        }
        return lblNewLabel;
    }

    private JComboBox getComboBox() {
        String[] options = {"Ajouter un contact", "Supprimer un contact"};

        if (comboBox == null) {
            comboBox = new JComboBox(options);

            comboBox.setFont(new Font("Tahoma", Font.PLAIN, 14));


            comboBox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JComboBox cb = (JComboBox) e.getSource();
                    String optionChoice = (String) cb.getSelectedItem();
                    if (optionChoice == "Supprimer un contact") {
                        getBtnNewButton().setVisible(false);
                        getLblNewLabel_1().setVisible(false);
                        getTextField().setVisible(false);
                        getLblNewLabel_1_1().setVisible(false);
                        getTextField_1().setVisible(false);
                        getLblNewLabel_1_3().setVisible(false);
                        getTextField_3().setVisible(false);
                        getLblNewLabel_1_2().setBounds(140, 98, 48, 14);
                        getTextField_2().setBounds(186, 96, 166, 20);
                        getBtnNewButton().setVisible(true);
                        getBtnDelete().setVisible(true);
                        getBtnNewButton1().setVisible(false);


                    }
                    if (optionChoice == "Ajouter un contact") {
                        getBtnNewButton().setVisible(false);
                        getLblNewLabel_1().setVisible(true);
                        getTextField().setVisible(true);
                        getLblNewLabel_1_1().setVisible(true);
                        getTextField_1().setVisible(true);
                        getLblNewLabel_1_3().setVisible(true);
                        getTextField_3().setVisible(true);
                        getLblNewLabel_1_2().setVisible(true);
                        getTextField_2().setVisible(true);
                        getLblNewLabel_1_2().setBounds(140, 156, 48, 14);
                        getTextField_2().setBounds(186, 154, 166, 20);
                        getBtnNewButton1().setVisible(true);
                        getBtnNewButton().setVisible(true);
                        getBtnDelete().setVisible(false);

                    }
                }
            });

            comboBox.setBounds(198, 48, 216, 22);
        }
        return comboBox;
    }

    private JLabel getLblNewLabel_1() {
        if (lblNewLabel_1 == null) {
            lblNewLabel_1 = new JLabel("Nom :");
            lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 13));
            lblNewLabel_1.setBounds(140, 98, 48, 14);
        }
        return lblNewLabel_1;
    }

    private JTextField getTextField() {
        if (textField == null) {
            textField = new JTextField();
            textField.setBounds(186, 96, 166, 20);
            textField.setColumns(10);
        }
        return textField;
    }

    private JTextField getTextField_1() {
        if (textField_1 == null) {
            textField_1 = new JTextField();
            textField_1.setColumns(10);
            textField_1.setBounds(186, 125, 166, 20);
        }
        return textField_1;
    }

    private JLabel getLblNewLabel_1_1() {
        if (lblNewLabel_1_1 == null) {
            lblNewLabel_1_1 = new JLabel("Prénom :");
            lblNewLabel_1_1.setFont(new Font("Tahoma", Font.PLAIN, 13));
            lblNewLabel_1_1.setBounds(124, 127, 71, 14);
        }
        return lblNewLabel_1_1;
    }

    private JTextField getTextField_2() {
        if (textField_2 == null) {
            textField_2 = new JTextField();
            textField_2.setColumns(10);
            textField_2.setBounds(186, 154, 166, 20);
        }
        return textField_2;
    }

    private JLabel getLblNewLabel_1_2() {
        if (lblNewLabel_1_2 == null) {
            lblNewLabel_1_2 = new JLabel("Email :");
            lblNewLabel_1_2.setFont(new Font("Tahoma", Font.PLAIN, 13));
            lblNewLabel_1_2.setBounds(140, 156, 48, 14);
        }
        return lblNewLabel_1_2;
    }

    private JTextField getTextField_3() {
        if (textField_3 == null) {
            textField_3 = new JTextField();
            textField_3.setColumns(10);
            textField_3.setBounds(186, 183, 166, 20);
        }
        return textField_3;
    }

    private JLabel getLblNewLabel_1_3() {
        if (lblNewLabel_1_3 == null) {
            lblNewLabel_1_3 = new JLabel("Mot de passe :");
            lblNewLabel_1_3.setFont(new Font("Tahoma", Font.PLAIN, 13));
            lblNewLabel_1_3.setBounds(96, 185, 92, 14);
        }
        return lblNewLabel_1_3;
    }


    private JButton getBtnNewButton() {
        if (btnNewButton == null) {
            btnNewButton = new JButton("Voir Annuaire");
            btnNewButton.setBounds(80, 233, 120, 23);
            setFont(new Font("Tahoma", Font.PLAIN, 13));

            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    EcranAnnuaire en = new EcranAnnuaire();
                    en.setVisible(true);

                }
            });
        }
        return btnNewButton;
    }

    public JButton getBtnNewButton1() {
        if (btnNewButton1 == null) {
            btnNewButton1 = new JButton("Valider");
            btnNewButton1.setBounds(250, 233, 120, 23);
            setFont(new Font("Tahoma", Font.PLAIN, 13));

            btnNewButton1.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    Contact contact = new Contact();
                    contact.setName(getTextField().getText());
                    contact.setSurname(getTextField_1().getText());
                    contact.setEmail(getTextField_2().getText());
                    contact.setPassword(getTextField_3().getText());
                    ContactController.get().save(contact);

                    JOptionPane.showMessageDialog(null, "Ajout du contact réussie");

                }
            });
        }
        return btnNewButton1;
    }

    public JButton getBtnDelete() {
        if (btnDelete == null) {
            btnDelete = new JButton("Supprimer");
            btnDelete.setBounds(250, 233, 120, 23);
            setFont(new Font("Tahoma", Font.PLAIN, 13));

            btnDelete.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
//
                    ContactController.get().delete(getTextField_2().getText());
                    JOptionPane.showMessageDialog(null, "Suppression du contact réussie");

                    //ContactController.getCatalogue();
//                    DefaultTableModel model = (DefaultTableModel) table.getModel();
//                    model.fireTableDataChanged();

                }
            });
        }
        return btnDelete;
    }

}
  
 
import java.util.List;

public class ContactController {

    private static List<Contact> annuaire;
    private EcranContacts ecranContacts;
    private ContactManager cm;
   // private List<Contact> annuaire;
    private static ContactController instance;
    private int indexCatalogue;

    public static synchronized ContactController get() {
        if(instance == null) {
            instance = new ContactController();
        }
        return instance;
    }


    public ContactController() {
            cm = new ContactManager();
            //J'initialise le catalogue en mémoire
            annuaire = cm.ListContacts();
    }

    public static List<Contact> getCatalogue() {
        return annuaire;
    }

    public void save(Contact contact) {

        cm.insertContact(contact);
        annuaire.add(contact);
    }

    public void delete(String email) {

        cm.delete(email);
    }

}

  
 

import javax.swing.table.AbstractTableModel;
import java.util.List;

public class TableCatalogueModel extends AbstractTableModel {

    private List<Contact> annuaire;
    private String[] columnNames = {"Nom", "Prénom", "Email", "Mot de passe"};

    public TableCatalogueModel(List<Contact> annuaire) {
        this.annuaire = annuaire;
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    public Class<?> getColumnClass(int columnIndex) {
        return getValueAt(0, columnIndex).getClass();
    }

    public String getColumnName(int column) {
        return columnNames[column];
    }


    @Override
    public int getRowCount() {
        return annuaire.size();
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Object val = null;

        switch (columnIndex) {
            case 0: val = annuaire.get(rowIndex).getName(); break;
            case 1: val = annuaire.get(rowIndex).getSurname(); break;
            case 2: val = annuaire.get(rowIndex).getEmail(); break;
            case 3: val = annuaire.get(rowIndex).getPassword(); break;
        }
        return val;
    }
}

  
 
import javax.swing.*;
import java.awt.*;
import java.util.List;

public class TableCatalogue extends JTable {

    private List<Contact> annuaire;

    public TableCatalogue(List<Contact> annuaire) {

        super(new TableCatalogueModel(annuaire));
        this.getColumnModel().getColumn(0).setPreferredWidth(50);
        this.getColumnModel().getColumn(1).setPreferredWidth(100);
        this.getColumnModel().getColumn(2).setPreferredWidth(100);
        this.getColumnModel().getColumn(3).setPreferredWidth(200);


        setPreferredScrollableViewportSize(new Dimension(500,70));
        setFillsViewportHeight(true);

        this.setRowHeight(30);

    }


}

  
 
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ContactManager {

    private static InterfaceDao daoContact;

    private Contactdao contactDao = new Contactdao();
    public static final Pattern VALID_EMAIL_ADDRESS_REGEX = Pattern.compile("^[A-Z0-9._% -] @[A-Z0-9.-] \.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);


    public ContactManager() {
        daoContact = DAOFactory.getContactDao();
    }


    /**
     * Insert Contact (USES ContactDao)
     *
     * @param contact
     */
    public void insertContact(Contact contact) {
        contactDao.insertContact(contact);
    }

    /**
     * Delete contact by Email (USES ContactDao)
     *
     * @param email
     */
    public void delete(String email) {
        contactDao.delete(email);
    }

    /**
     * List of all the contacts - select all (USES ContactDao)
     *
     * @return
     */
    public List<Contact> ListContacts() {
        return contactDao.ListContacts();
    }

    public static boolean validateEmail(String email) {
        Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(email);
        return matcher.find();
    }

    public static boolean validateName(String name) {
        boolean validName = true;
        if (name == "") {
            validName = false;
        }
        return validName;
    }
}

  

Комментарии:

1. Я пробовал отслеживать ваш код, но Contactdao он отсутствует. Основной ответ на ваш вопрос заключается в том, что что-то должно сказать TableModel , что строка была удалена

2. Минимальный воспроизводимый пример был бы лучше, т. Е. Удалите все, что не имеет никакого отношения к вашей проблеме.

Ответ №1:

я думаю, что проблема в вашем классе ContactController в методе удаления, который вы удаляете из базы данных, а не из ежегодного списка: (вот почему это работает при повторном открытии)
, поэтому измените свой метод удаления :

 public void delete(String email) {
   contactDao.delete(email);
   annuairel.removeIf((value) -> {
        return value.email == email;
   });
}
  

и это заставит его работать

Комментарии:

1. Да, точно, он не удалялся из списка, просто нужно было добавить : annuaire.removeIf((value) -> { return value.getEmail().equals(email); });

2. Привет @IlyesMakira если этот ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы принять его, установив флажок. Это указывает более широкому сообществу, что вы нашли решение, и дает некоторую репутацию как ответчику, так и вам. Нет никаких обязательств делать это.