我在更新时遇到了一些问题,并显示了人员(电话簿联系人)的数组列表。我尝试使用Jbutton将用户输入数据添加到数组列表中,并显示在Jtable中。
如果您能告诉我是否存在设计或实施问题,我将不胜感激。提前感谢您的建议!
以下是代码的一部分
自定义表格型
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);
}
}
电话簿类
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);
}
});
}
答案 0 :(得分:1)
我尝试使用Jbutton将用户输入数据添加到数组列表中,并显示在Jtable中。
这是错误的做法。 TableModel应该包含所有数据。因此,您需要一种方法将一行数据添加到TableModel
NrTel [] contacte = new NrTel [0];
没有任何意义,你试图创建一个数组来保存所有数据,但它只有0行。您不应该使用数组来保存数据,因为您不知道应该添加多少行。相反,您应该使用ArrayList来保存NrTel对象。然后,每次向模型添加行时,只需将Object添加到ArrayList。
查看Row Table Model以了解自定义模型的一般实现。您仍然需要实现一些方法来支持您的NrTel对象。 JButtonTableMode.java
显示了如何实现这些方法,只需更改类的代码即可。