Reputation: 49
I'm having some problems getting updated and displayed an array list of people(phonebook contacts). I try to add user input data to an array list using a Jbutton and to be displayed in a Jtable.
I would appreciate if you can tell me if there is a design or implementation problem. Thank you in advance for your suggestions!
Here is a part of the code
Custom Table Model
package cartedetelefon.GUI;
import static cartedetelefon.CarteDeTelefon.listaContacte;
import cartedetelefon.Exceptii.ExceptieContactDejaDefinit;
import cartedetelefon.NrTel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
public class TblModel extends AbstractTableModel implements TableModelListener{
NrTel[] contacte = new NrTel[0];
@Override
public int getRowCount() {
return listaContacte.size();
}
@Override
public int getColumnCount() {
return 6;
}
@Override
public Object getValueAt(int linie, int coloana) {
NrTel contact = contacte[linie];
switch (coloana){
case 0: return contact;
case 1: return contact.getPersoana().getNume();
case 2: return contact.getPersoana().getPrenume();
case 3: return contact.getNrmobil();
case 4: return contact.getNrbirou();
case 5: return contact.getNrhome();
default: return "Eroare";
}
}
public void adaugareContact(NrTel c) throws ExceptieContactDejaDefinit {
if (listaContacte.contains(c)) throw new ExceptieContactDejaDefinit("Datele de contact pentru "+c.getPersoana()+ " exista!");
listaContacte.add(c);
fireTableRowsInserted(contacte.length-1, contacte.length-1);
}
@Override
public String getColumnName(int coloana) {
return new String[] {"Nume", "Prenume", "CNP", "Mobil", "Birou", "Resedinta"}[coloana];
}
@Override
public void tableChanged(TableModelEvent tme) {
int row = tme.getFirstRow();
int column = tme.getColumn();
TblModel model = (TblModel)tme.getSource();
String coloana = model.getColumnName(column);
Object data = model.getValueAt(row, column);
}
}
Phonebook Class
public class CarteDeTelefon{
public static List<NrTel> listaContacte = new ArrayList<>();
public Collection<NrTel> getToateContactele() {
return listaContacte;
}
GUI
package cartedetelefon.GUI;
import cartedetelefon.CarteDeTelefon;
import static cartedetelefon.CarteDeTelefon.listaContacte;
import cartedetelefon.NrTel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelListener;
public class GUI extends javax.swing.JFrame {
static private final String newline = "\n";
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents(){}
private void adaugaActionPerformed(java.awt.event.ActionEvent evt) {
**// TODO add your handling code here:**
// a possible solution but i don't know how to link this with the arraylist
Object row[]=new Object[6];
while((row[0]=JOptionPane.showInputDialog("Nume:")).equals(""));
while((row[1]=JOptionPane.showInputDialog("Prenume:")).equals(""));
while((row[2]=JOptionPane.showInputDialog("Cod numeric personal:")).equals(""));
while((row[3]=JOptionPane.showInputDialog("Numar telefon mobil:")).equals(""));
while((row[4]=JOptionPane.showInputDialog("Numar telefon birou:")).equals(""));
while((row[5]=JOptionPane.showInputDialog("Numar telefon resedinta:")).equals(""));
//model.adaugareContact(new NrTel(null, newline, newline, newline, newline)); this is not working
}
JTextArea log;
private TableModelListener tml;
/**
* Creates new form GUI
*/
public GUI() {
initComponents();
TblModel model = new TblModel();
listaAbonatiGUI.setModel(model);
listaAbonatiGUI.getModel().addTableModelListener(tml);
}
public static void main(String args[]){
CarteDeTelefon pb = new CarteDeTelefon();
Collection<NrTel> contacte = pb.getToateContactele();
Collections.sort((List<NrTel>) contacte);
System.out.println("Contacte cu detalii " +contacte);
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new GUI().setVisible(true);
}
});
}
Upvotes: 1
Views: 1680
Reputation: 324177
I try to add user input data to an array list using a Jbutton and to be displayed in a Jtable.
That is the wrong approach. The TableModel should hold all the data. So you need a method to add a row of data to the TableModel
NrTel[] contacte = new NrTel[0];
That makes no sense you are trying to create an Array to hold all the data but it only has 0 row. You should NOT use an Array to hold data since you don't know how many rows should be added. Instead you should use an ArrayList to hold the NrTel objects. Then every time you add a row to the model you just add the Object to the ArrayList.
Take a look at the Row Table Model for a generic implementation of a custom model. You will still need to implement a couple of methods to support your NrTel object. The JButtonTableMode.java
shows how you might implement these methods, just change the code for your class.
Upvotes: 1