java - 将用户输入数据添加到 ArrayList 并使用自定义 Tablemodel 将其显示到 Jtable 中

标签 java swing user-interface arraylist jtable

我在更新和显示人员列表(电话簿联系人)时遇到一些问题。我尝试使用 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;
}

图形用户界面

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);
        }
    });
}

最佳答案

I try to add user input data to an array list using a Jbutton and to be displayed in a Jtable.

这是错误的做法。 TableModel 应保存所有数据。所以你需要一个方法来向TableModel添加一行数据

NrTel[] contacte = new NrTel[0];

您试图创建一个数组来保存所有数据,但它只有 0 行,这是没有意义的。您不应该使用数组来保存数据,因为您不知道应该添加多少行。相反,您应该使用 ArrayList 来保存 NrTel 对象。然后,每次向模型添加一行时,只需将对象添加到 ArrayList 即可。

看看Row Table Model用于自定义模型的通用实现。您仍然需要实现一些方法来支持您的 NrTel 对象。 JButtonTableMode.java 显示了如何实现这些方法,只需更改类的代码即可。

关于java - 将用户输入数据添加到 ArrayList 并使用自定义 Tablemodel 将其显示到 Jtable 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24439536/

相关文章:

java - 寻找多线程死锁的原因?

java - Scala/Swing - 响应同时发生的多个关键事件

c++ - 寻找 C++ 的应用程序 GUI 库

java - 餐巾外观和感觉错误

Java - 通过文本 UI 将人员添加到链接列表

java - Spring 3 MVC 请求验证

java - 在java中缩短类型名称

java - 为什么 Java 中不是默认启用所有密码套件?

Java Swing - 分组组件

表内的 Java 组合框覆盖写入数据