是否可以使用for循环将字符串数组插入jtable

时间:2016-03-12 16:21:45

标签: java swing netbeans-8

我遇到了麻烦,我无法在jTable中插入字符串数组。场景是我在数组中有一些选定的值,我想将该值插入jTable。

我的代码在这里:

import java.util.Arrays;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;


public class as extends javax.swing.JFrame {


public as() {
    initComponents();
}


@SuppressWarnings("unchecked")

private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    t1 = new javax.swing.JTable();
    jScrollPane2 = new javax.swing.JScrollPane();
    t2 = new javax.swing.JTable();
    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    t1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {"122", "a", null, null},
            {"123", "b", null, null},
            {"124", "c", null, null},
            {"125", "d", null, null},
            {"126", "e", null, null}
        },
        new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
    ));
    jScrollPane1.setViewportView(t1);

    t2.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {

        },
        new String [] {
            "Title 1", "Title 2"
        }
    ));


private void jButton1MouseReleased(java.awt.event.MouseEvent evt) {                                       
    // TODO add your handling code here:

            Vector R_D=new Vector();

    if(t1.getRowCount()>0){
        String[] ary = new String[t1.getRowCount()];
        try{
            for(int i=0;i<t1.getRowCount();i++){                
                R_D.add(t1.getValueAt(i, 0).toString());
                ary[i]=t1.getValueAt(i, 0).toString();
                System.out.println(Arrays.toString(ary)+i);
                ((DefaultTableModel) t2.getModel()).addRow(ary);  

            }
        }
        catch(Exception d)
            {System.out.println(d.getMessage());}


    }
}                                      

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {        

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new as().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable t1;
private javax.swing.JTable t2;
// End of variables declaration                   

我在名为ary[]的数组中找到了正确的答案。

我需要将所有数组值复制到单独的jTable行中。

但是结果在一些空表中结束而没有显示任何错误

只看到裁剪的屏幕截图

Input

这是选择员工名单的表格。

单击Create Attendance List按钮后,结果为

Actualand wrong answer

表格看起来像这样。

但我需要一个看起来像这样的结果

Want this result

请帮帮我。

3 个答案:

答案 0 :(得分:2)

  

我无法将字符串数组插入到jTable中。

好吧,我没有看到你试图这样做的任何代码。

首先阅读DefaultTableModel API。您可以使用数据轻松创建DefaultTableModel。你可以:

  1. 创建一个空的DefaultTableModel,然后使用addRow(...)方法在循环中添加一行。

  2. 您可以使用所需的行数创建DefaultTableModel。然后,您可以使用setValueAt(...)方法更改每行中的数据。

  3. 如果您需要更多帮助,请发布适当的SSCCE,以证明您遇到的问题。

    编辑:

    SSCCE的示例,只需在按下按钮时向表中添加一行数据。代码创建一个包含两个值的Array,然后调用DefaultTableModel的addRow(...)方法。

    import java.awt.*;
    import java.beans.*;
    import java.awt.event.*;
    import java.util.*;
    import java.io.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    
    public class TableRowColumn2 extends JFrame
    {
        private final static String LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        JTable table;
        DefaultTableModel model;
        JPanel buttonPanel;
        JButton button;
    
        public TableRowColumn2()
        {
            //  Create table
    
            Object[][] data =
            {
                {new Integer(1), "A"},
                {new Integer(2), "B"},
                {new Integer(3), "C"}
            };
            String[] columnNames = {"Number","Letter"};
            model = new DefaultTableModel(data, columnNames);
            table = new JTable(model)
            {
                public boolean isCellEditable(int row, int column)
                {
                    return true;
                }
            };
    
            table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            table.changeSelection(0, 0, false, false);
            table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    
            table.getColumnModel().getColumn(0).setCellRenderer( table.getDefaultRenderer(Integer.class) );
    
            //  Add table and a Button panel to the frame
    
            final JScrollPane scrollPane = new JScrollPane( table );
            getContentPane().add( scrollPane, BorderLayout.CENTER );
    
            buttonPanel = new JPanel();
            getContentPane().add( buttonPanel, BorderLayout.NORTH );
    
            button = new JButton( "Add Row" );
            button.setMnemonic('A');
            buttonPanel.add( button );
            button.addActionListener( new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    model.addRow( createRow() );
                    int row = table.getRowCount() - 1;
                    table.changeSelection(row, 0, false, false);
                    table.requestFocusInWindow();
                }
            });
    
        }
    
        private Object[] createRow()
        {
            Object[] newRow = new Object[2];
            int row = table.getRowCount();
            newRow[0] = Integer.toString(row + 1);
            row = (row % 26) + 1;
            newRow[1] = LETTERS.substring(row-1, row);
            return newRow;
        }
    
        public static void main(String[] args)
        {
            TableRowColumn2 frame = new TableRowColumn2();
            frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible(true);
        }
    }
    

    在您的情况下,您需要获取每个选定的行。然后,对于每一行,您将:

    1. 为要复制的数据创建一个数组。
    2. 然后在第二个TableModel
    3. 上调用addRow(...)方法

      所以基本上你需要更改ActionListner中的代码来添加一个循环来完成上述两个步骤。

答案 1 :(得分:0)

您可以使用此方法将String []添加到JTable:

首先你必须得到模型,然后你必须添加String []:

((TableModel) Tbl_To.getModel()).addRow(Ary);

使用此方法,您选择的数据位于JTable的一行中。

答案 2 :(得分:0)

最后我找到了实现目标的技巧.. 我创建了一个虚拟数组,然后在插入行数据之前调用数组值。之后我使用setValues来设置mystring数组的值。这就是我的意思。

这是我编辑的代码

    Vector R_D=new Vector();

    if(Tbl_AddAttTo.getRowCount()>0){
        String[] Dary = {"nil","nil","nil","nil"};
        String[] ary = new String[Tbl_AddAttTo.getRowCount()];
        try{
            for(int i=0;i<Tbl_AddAttTo.getRowCount();i++){                
                R_D.add(Tbl_AddAttTo.getValueAt(i, 0).toString());
                ary[i]=Tbl_AddAttTo.getValueAt(i, 0).toString();

               ((DefaultTableModel) Tbl_Exp_Mgr1.getModel()).addRow(Dary);
                Tbl_Exp_Mgr1.setValueAt(ary[i], i, 0);

            }
        }
        catch(Exception d)
            {System.out.println(d.getMessage());}
    }