Возникли проблемы со списками в java - PullRequest
0 голосов
/ 03 мая 2020

У меня сильная головная боль с проектом колледжа. Я делаю банковское приложение, и у меня возникают проблемы с составлением списка счетов и хранением информации.

Это класс, с которым я работаю, он получает номер счета, имя, некоторую идентификацию от пользователя, сумму денег внутри счета и пароль:

public class Conta {
    private int NumConta;
    private String Nome;
    private String RG;
    private String CPF;
    private double Saldo;
    private String Password;

    public Conta(int NumConta, String Nome, String RG, String CPF, double Saldo, String Password) {
        this.NumConta = NumConta;
        this.Nome = Nome;
        this.RG = RG;
        this.CPF = CPF;
        this.Saldo = Saldo;
        this.Password = Password;
    }

    Conta() {
    }

    public int getNumConta() {
        return NumConta;
    }

    public void setNumConta(int NumConta) {
        this.NumConta = NumConta;
    }

    public String getNome() {
        return Nome;
    }

    public void setNome(String Nome) {
        this.Nome = Nome;
    }

    public String getRG() {
        return RG;
    }

    public void setRG(String RG) {
        this.RG = RG;
    }

    public String getCPF() {
        return CPF;
    }

    public void setCPF(String CPF) {
        this.CPF = CPF;
    }

    public double getSaldo() {
        return Saldo;
    }

    public void setSaldo(double Saldo) {
        this.Saldo = Saldo;
    }

    public String getPassword() {
        return Password;
    }

    public void setPassword(String Password) {
        this.Password = Password;
    }

}

Это здесь ниже это jframe я использую зарегистрировать новые учетные записи. Пользователь вводит информацию, и когда он нажимает кнопку, он должен получить всю информацию из текстовых строк и отправить ее в addFun c, чтобы информация могла быть сохранена в списке. Обратите внимание, что у меня есть «для» там только для того, чтобы увидеть, что происходит со списком. Он получает информацию и печатает на консоль, но если я делаю новую запись, она либо перезаписывается, либо происходит что-то еще, потому что я вижу только последнюю введенную регистрацию:

package banco_projeto;

import java.util.Random;
import javax.swing.JOptionPane;

public class Cadastrar extends javax.swing.JFrame {

    public Cadastrar() {
        initComponents();
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanelinicio = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jTextFieldnomecadastro = new javax.swing.JTextField();
        jTextFieldRG = new javax.swing.JTextField();
        jTextFieldCPF = new javax.swing.JTextField();
        jTextFieldpasswordcadastro = new javax.swing.JTextField();
        jButtonconfirmarcadastro = new javax.swing.JButton();
        jButtonvoltarCadastrar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanelinicio.setBackground(new java.awt.Color(102, 153, 255));

        jPanel2.setBackground(new java.awt.Color(255, 255, 255));

        jLabel1.setText("RG:");

        jLabel2.setText("CPF:");

        jLabel3.setText("Nome:");

        jLabel4.setText("Password:");

        jButtonconfirmarcadastro.setText("Confirmar");
        jButtonconfirmarcadastro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonconfirmarcadastroActionPerformed(evt);
            }
        });

        jButtonvoltarCadastrar.setText("Voltar");
        jButtonvoltarCadastrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonvoltarCadastrarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel3)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2)
                    .addComponent(jLabel4))
                .addGap(58, 58, 58)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextFieldpasswordcadastro, javax.swing.GroupLayout.PREFERRED_SIZE, 255, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextFieldCPF, javax.swing.GroupLayout.PREFERRED_SIZE, 255, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextFieldRG, javax.swing.GroupLayout.PREFERRED_SIZE, 255, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextFieldnomecadastro, javax.swing.GroupLayout.PREFERRED_SIZE, 255, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(77, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jButtonconfirmarcadastro, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButtonvoltarCadastrar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(173, 173, 173))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(56, 56, 56)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jTextFieldnomecadastro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(47, 47, 47)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextFieldRG, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(43, 43, 43)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jTextFieldCPF, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(40, 40, 40)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel4)
                    .addComponent(jTextFieldpasswordcadastro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(68, 68, 68)
                .addComponent(jButtonconfirmarcadastro)
                .addGap(18, 18, 18)
                .addComponent(jButtonvoltarCadastrar)
                .addContainerGap(28, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout jPanelinicioLayout = new javax.swing.GroupLayout(jPanelinicio);
        jPanelinicio.setLayout(jPanelinicioLayout);
        jPanelinicioLayout.setHorizontalGroup(
            jPanelinicioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        jPanelinicioLayout.setVerticalGroup(
            jPanelinicioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelinicioLayout.createSequentialGroup()
                .addGap(0, 117, Short.MAX_VALUE)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanelinicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanelinicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        pack();
        setLocationRelativeTo(null);
    }// </editor-fold>                        

    private void jButtonvoltarCadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                                       
        Principal principal = new Principal();
        principal.setVisible(true);           
        dispose();
    }                                                      

    private void jButtonconfirmarcadastroActionPerformed(java.awt.event.ActionEvent evt) {                                                         
        Random random = new Random();
        int numero = random.nextInt(9999999);
        Conta conta = new Conta(numero,jTextFieldnomecadastro.getText(),jTextFieldRG.getText(),jTextFieldCPF.getText(),0,jTextFieldpasswordcadastro.getText());
        Control control = new Control();
        control.AddFunc(conta);
        JOptionPane.showMessageDialog(this, "Conta criada com sucesso!\n"+"Numero da conta: "+numero);
                        for(int i = 0; i<control.listaContas.size();i++){
                             System.out.println("info na lista dentro for : "+control.listaContas.get(i).getCPF()+"\nindice do i"+i);
                        }

        Principal p = new Principal();
        p.setVisible(true);
        dispose();
    }                                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Cadastrar().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButtonconfirmarcadastro;
    private javax.swing.JButton jButtonvoltarCadastrar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanelinicio;
    private javax.swing.JTextField jTextFieldCPF;
    private javax.swing.JTextField jTextFieldRG;
    private javax.swing.JTextField jTextFieldnomecadastro;
    private javax.swing.JTextField jTextFieldpasswordcadastro;
    // End of variables declaration                   
}

Это класс i Я сделал, чтобы сохранить список учетных записей и сделал функцию добавления, чтобы добавить элементы в список

package banco_projeto;

import java.util.ArrayList;

public class Control {
    ArrayList<Conta> listaContas = new ArrayList();
    Conta conta = new Conta();

    public Conta getConta() {
        return conta;
    }

    public void setConta(Conta conta) {
        this.conta = conta;
    }

    public ArrayList<Conta> getListaContas() {
        return listaContas;
    }

    public void setListaContas(ArrayList<Conta> listaContas) {
        this.listaContas = listaContas;
    }
        public void AddFunc(Conta conta){        
        //System.out.println("info na variavel conta: "+conta.getNumConta());
        listaContas.add(conta); 
        //System.out.println("info na lista pos zero : "+listaContas.get(0).getNumConta());
    }

}

У меня все еще есть пара других jframes, но я не уверен, имеют ли они отношение к моей проблеме. Я неправильно строю список? Что происходит с моим списком? Это потому, что я создаю объекты внутри методов? Это работает, и я просто не знаю, как манипулировать списком? Я пробовал несколько разных подходов, но ничего не изменилось. Если бы вы могли предоставить мне пример того, как это исправить, я буду очень признателен.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 03 мая 2020

Проблемы:

  • Как уже упоминалось в моем комментарии, объект Control не должен создаваться в слушателе
  • Если вы создаете несколько объектов Cadastrar, тогда объект Control не должен быть создан в этом классе.
  • Скорее, его следует создать в классе модели, отличном от GUI, и передать его в Cadastrar с помощью параметра конструктора, задающего поле. Например:

    public class Cadastrar extends javax.swing.JFrame {
        Control control;
    
        public Cadastrar(Control control) {
            this.control = control;
            initComponents();
        }
    
  • Кадастр должен быть не JFrame, а JDialog, возможно, моделью JDialog

  • И если это так, управляющий класс должен контролировать, какой windows отображать следующий, а не кадастровый. См .: Использование нескольких JFrames: хорошая или плохая практика?

В комментарии вы заявляете:

Я создаю один, это делает свою работу и закрывается (с dispose ();). Затем я снова вызываю кадастровый jframe (из кнопки в другом jframe) и создаю второй аккаунт. Я пытался не избавляться от jframe Cadastrar, держал его открытым, но результат тот же. Должен ли я показать jframe, откуда вызывается Cadastrar?

Точно так, как я думал - каждый раз, когда вы создаете новый объект Cadastrar, вы создаете новый объект Control, и все ранее сохраненные данные исчезают. Решение, как я уже упоминал выше - создайте один Управляющий объект и передайте его, где это необходимо.

Ваш дизайн программы также не так хорош, как вам действительно следует думать отделяя не GUI программные логи c, «модель», от части GUI, «представление», и вы не хотите бросать несколько JFrames на бедного пользователя, поскольку это может быть довольно раздражающим пользователю. Подумайте о наиболее профессиональном программном обеспечении, которое вы используете, и лишь немногие из них выберут несколько windows для пользователя. Лучше поменять местами представления через CardLayout с временным диалогом (JDialog) windows, а не с несколькими основными программами (JFrame) windows. Должен быть один JFrame, который отображается на протяжении всей жизни программы.

1 голос
/ 03 мая 2020

Ваша проблема здесь:

Control control = new Control();
control.AddFunc(conta);
JOptionPane.showMessageDialog(this, "Conta criada com sucesso!\n"+"Numero da conta: "+numero);
    for(int i = 0; i<control.listaContas.size();i++){
        System.out.println("info na lista dentro for : "+control.listaContas.get(i).getCPF()+"\nindice do i"+i);
    }

Каждый раз, когда вызывается метод jButtonconfirmarcadastroActionPerformed, вы создаете новый элемент управления, добавляете в него созданный в настоящий момент Conta и затем печатаете свой список. В следующий раз вы создадите новый и распечатаете его снова.

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

...