Java 将行添加到JTable时出错

Java 将行添加到JTable时出错,java,arrays,swing,jtable,defaulttablemodel,Java,Arrays,Swing,Jtable,Defaulttablemodel,我有一个JButton,一旦按下它,就会在JTable中添加一行。我尝试通过实现以下代码来实现这一点 columNames = new Vector<>(); columNames.addElement("Name"); columNames.addElement("CC"); columNames.addElement("Age"); columNames.addElement("PhoneNumber"); columNames.addElement("Date"); colum

我有一个
JButton
,一旦按下它,就会在
JTable
中添加一行。我尝试通过实现以下代码来实现这一点

columNames = new Vector<>();
columNames.addElement("Name");
columNames.addElement("CC");
columNames.addElement("Age");
columNames.addElement("PhoneNumber");
columNames.addElement("Date");
columNames.addElement("Amount$");

Object[] dataList = {"name", "cc", "age", "phone", "date", "amount"};

data = new DefaultTableModel(columNames, 0);
data.addRow(dataList);

table = new JTable(data);
JScrollPane scrollTable = new JScrollPane(table);
scrollTable.setBounds(22, 78, 764, 177);
scrollTable.setViewportView(table);

//ActionListener method!.

if(e.getActionCommand().equals("Add client"))
{
    Object[] dataList = {"name", "cc", "age", "phone", "date", "amount"};
    data.addRow(dataList);

    DefaultTableModel defaut = (DefaultTableModel) table.getModel();
    defaut.addRow(dataList);
}
columNames=newvector();
列名称。附录(“名称”);
柱状附录(“CC”);
圆柱状附录(“年龄”);
columNames.addElement(“电话号码”);
列明附录(“日期”);
列名称。附录(“金额$”;
对象[]数据列表={“姓名”、“抄送”、“年龄”、“电话”、“日期”、“金额”};
数据=新的DefaultTableModel(columNames,0);
data.addRow(数据列表);
表=新的JTable(数据);
JScrollPane scrollTable=新的JScrollPane(表);
滚动表.立根(22,78,764,177);
scrollTable.setViewportView(表格);
//ActionListener方法!。
if(例如getActionCommand().equals(“添加客户端”))
{
对象[]数据列表={“姓名”、“抄送”、“年龄”、“电话”、“日期”、“金额”};
data.addRow(数据列表);
DefaultTableModel defaut=(DefaultTableModel)table.getModel();
defaut.addRow(数据列表);
}
它在线程“AWT-EventQueue-0”java.lang.ArrayIndexOutOfBoundsException中引发异常
-1


如何解决它?

如下面的完整示例所示,您的片段似乎工作正常。该示例可以帮助您在完整代码中隔离问题。另外,

  • 替代
    setBounds()
    ,重写
    getPreferredScrollableViewportSize()
    以返回所建议的
    getRowHeight()
    ,以及
    pack()
    封闭窗口的倍数

  • 另见

  • 正如所建议的那样,更新
    表格模型
    的重复失败表明您可能正在引用一个对象的意外实例

导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.util.Vector;
导入javax.swing.AbstractAction;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableModel;
/**
*@见https://stackoverflow.com/a/38926460/230513
*/
公开课考试{
私有最终对象[]数据列表={“姓名”、“抄送”、“年龄”、“电话”、“日期”、“金额”};
专用void display(){
JFrame f=新JFrame(“测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
向量列名称=新向量();
列名称。附录(“名称”);
柱状附录(“CC”);
圆柱状附录(“年龄”);
columNames.addElement(“电话”);
列明附录(“日期”);
列名称。附录(“金额$”;
DefaultTableModel数据=新的DefaultTableModel(columNames,0);
data.addRow(数据列表);
JTable table=新的JTable(数据);
JScrollPane scrollTable=新的JScrollPane(表);
scrollTable.setViewportView(表格);
f、 添加(新JScrollPane(表));
f、 添加(新JButton)(新抽象操作(“添加”){
@凌驾
已执行的公共无效操作(操作事件e){
data.addRow(数据列表);
}
}),边框布局。第_页结束);
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
invokeLater(新测试()::显示);
}
}

您的ActionListener似乎两次尝试将dataList数组添加到表模型中,一次是通过数据对象,一次是通过提取的表模型——为什么?为什么不试着简单地加上一次?如果TrashGod的回答不能帮助你解决这个问题,那么请考虑创建并发布一个有效的,一个小的独立的程序来演示你的问题,与垃圾神在下面发布的内容类似。@HovercraftFullOfEels我试图添加两次,因为第二个是动作监听器wuich将添加新行。@HovercraftFullOfEels指的是对
动作监听器中的
addRow()
的冗余调用。哪一个为您提供了
ArrayIndexOutOfBoundsException
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 * @see https://stackoverflow.com/a/38926460/230513
 */
public class Test {

    private final Object[] dataList = {"name", "cc", "age", "phone", "date", "amount"};

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Vector columNames = new Vector<>();
        columNames.addElement("Name");
        columNames.addElement("CC");
        columNames.addElement("Age");
        columNames.addElement("Phone");
        columNames.addElement("Date");
        columNames.addElement("Amount$");
        DefaultTableModel data = new DefaultTableModel(columNames, 0);
        data.addRow(dataList);
        JTable table = new JTable(data);
        JScrollPane scrollTable = new JScrollPane(table);
        scrollTable.setViewportView(table);
        f.add(new JScrollPane(table));
        f.add(new JButton(new AbstractAction("Add") {
            @Override
            public void actionPerformed(ActionEvent e) {
                data.addRow(dataList);
            }
        }), BorderLayout.PAGE_END);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}