用户输入数据添加到一个ArrayList,并将其显示到使用JTable中定制一个的TableModel [英] Add user input data to an ArrayList and display it into a Jtable using custom a Tablemodel

查看:1132
本文介绍了用户输入数据添加到一个ArrayList,并将其显示到使用JTable中定制一个的TableModel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些问题得到更新并显示出来的人(电话簿联系人)一个数组列表。我尝试使用一个JButton用户输入数据添加到一个数组列表,并显示在JTable中。

我AP preciate如果你能告诉我,如果有设计或实现问题。预先感谢您为您的建议!

下面是code的一部分

自定义表型号

 包cartedetelefon.GUI;引入静态cartedetelefon.CarteDeTelefon.listaContacte;
进口cartedetelefon.Exceptii.ExceptieContactDejaDefinit;
进口cartedetelefon.NrTel;
进口javax.swing.event.TableModelEvent;
进口javax.swing.event.TableModelListener;
进口javax.swing.table.AbstractTableModel中;公共类TblModel扩展AbstractTableModel上实现TableModelListener {NrTel [] contacte =新NrTel [0];    @覆盖
公众诠释getRowCount(){
    返回listaContacte.size();
}    @覆盖
公众诠释getColumnCount(){
    返回6;
}    @覆盖
公共对象getValueAt(INT LINIE,诠释coloana){    NrTel接触= contacte [LINIE]
    开关(coloana){
        情况下0:返回接触;
        情况1:返回contact.getPersoana()getNume();
        案例2:返回contact.getPersoana()获得prenume();
        案例3:返回contact.getNrmobil();
        情况4:返回contact.getNrbirou();
        案例5:返回contact.getNrhome();            默认:回归Eroare
    }
}公共无效adaugareContact(NrTel c)抛掷ExceptieContactDejaDefinit {
    如果(listaContacte.contains(C))抛出新ExceptieContactDejaDefinit(Datele去接触pentru+ c.getPersoana()+exista!);
                  listaContacte.add(C);
                  fireTableRowsInserted(contacte.length-1,contacte.length-1);
}@覆盖
公共字符串getColumnName(INT coloana){
    返回新的String [] {Nume,prenume,CNP,美孚,碧柔,Resedinta} [coloana];
}@覆盖
公共无效tableChanged(TableModelEvent TME){
    INT行= tme.getFirstRow();
    INT列= tme.getColumn();
    TblModel模型=(TblModel)tme.getSource();
    字符串coloana = model.getColumnName(列);
    对象数据= model.getValueAt(行,列);
  }}

电话簿类

 公共类CarteDeTelefon {公共静态列表< NrTel> listaContacte =新的ArrayList<>();
公文集< NrTel> getToateContactele(){
    返回listaContacte;
}

GUI

 包cartedetelefon.GUI;
进口cartedetelefon.CarteDeTelefon;
引入静态cartedetelefon.CarteDeTelefon.listaContacte;
进口cartedetelefon.NrTel;
进口java.awt.BorderLayout中;
进口java.awt.Component中;
进口java.awt.Dimension中;
进口java.awt.Frame中;
进口java.awt.Toolkit中;
进口java.awt.event.MouseAdapter;
进口java.awt.event.MouseEvent中;
进口的java.io.File;
进口java.io.FileInputStream中;
进口java.io.FileOutputStream中;
进口java.io.IOException异常;
进口java.io.ObjectInputStream中;
进口java.io.ObjectOutputStream中;
进口java.util.Collection中;
进口java.util.Collections中;
进口的java.util.List;
进口java.util.logging.Level中;
进口java.util.logging.Logger中;
进口javax.swing.ImageIcon中;
进口javax.swing.JFileChooser中;
进口javax.swing.JLabel中;
进口javax.swing.JOptionPane中;
进口javax.swing.JTable中;
进口javax.swing.JTextArea中;
进口javax.swing.JWindow中;
进口javax.swing.SwingUtilities中;
进口javax.swing.event.TableModelListener;
公共类GUI扩展javax.swing.JFrame中{
    静态私有最终字符串换行=\\ n;@燮pressWarnings(未登记)
//<主编倍defaultstate =崩溃DESC =生成code>
私人无效的initComponents(){}私人无效adaugaActionPerformed(EVT java.awt.event.ActionEvent中){
    ** // TODO添加您处理code在这里:**    //一个可能的解决方案,但我不知道如何与数组列表链接此
    对象行[] =新对象[6];
     而((行[0] = JOptionPane.showInputDialog(Nume:))等于());
     而((行[1] = JOptionPane.showInputDialog(prenume:))等于());
         而((行[2] = JOptionPane.showInputDialog(鳕数字个人:))等于());
         而((行[3] = JOptionPane.showInputDialog(Numar公司电话美孚:))等于());
         而((行[4] = JOptionPane.showInputDialog(Numar公司电话碧柔:))等于());
         而((行[5] = JOptionPane.showInputDialog(Numar公司电话resedinta:))等于());
     //model.adaugareContact(new NrTel(空,换行,换行,换行,换行));这是不工作}
JTextArea中登录;
私人TableModelListener TML;/ **
 *创建新形式的GUI
 * /
公共GUI(){
    的initComponents();    TblModel模式=新TblModel();
    listaAbonatiGUI.setModel(模型);
。listaAbonatiGUI.getModel()addTableModelListener(TML);
}公共静态无效的主要(字符串ARGS []){
CarteDeTelefon PB =新CarteDeTelefon();
    收集和LT; NrTel> contacte = pb.getToateContactele();
    Collections.sort((名单< NrTel>)contacte);
    的System.out.println(Contacte立方米资讯这+ contacte);    / *创建和显示表单* /
    了java.awt.EventQueue.invokeLater(新的Runnable(){
        @覆盖
        公共无效的run(){
            新的GUI()调用setVisible(真);
        }
    });
}


解决方案

  

我尝试使用一个JButton用户输入数据添加到一个数组列表,并显示在JTable中。


这是错误的做法。为TableModel应该持有的所有数据。所以,你需要一种方法来一行数据添加到TableModel的


  

NrTel [] = contacte新NrTel [0];


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

看看在行表型号为通用实现一个自定义模式。您仍然需要实现几个方法来支持你的NrTel对象。在 JButtonTableMode.java 显示了如何实现这些方法,只是改变了code为你的类。

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

解决方案

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.

这篇关于用户输入数据添加到一个ArrayList,并将其显示到使用JTable中定制一个的TableModel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆