【问题标题】:Is it possible to Insert a string array into jtable using for loop是否可以使用 for 循环将字符串数组插入 jtable
【发布时间】:2016-03-12 16:21:45
【问题描述】:

我遇到了一个问题,我无法将字符串数组插入到 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 行中。

但结果以一些空表结束,没有显示任何错误

只看裁剪的屏幕截图

这是具有选定员工列表的表格。

点击创建考勤列表按钮后,结果为

表格将如下所示。

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

请帮帮我。

【问题讨论】:

  • 变量名不应以大写字符开头。当您创建 SSCCE 时,请修复您的变量名。
  • 对不起,我的错误,我编辑了它,看看。

标签: java swing netbeans-8


【解决方案1】:

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

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

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

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

  2. 您可以使用所需的行数创建 DefaultTableModel。然后就可以使用setValueAt(...)方法改变每一行的数据了。

如果您需要更多帮助,请发布正确的SSCCE 来说明您遇到的问题。

编辑:

SSCCE 的一个示例,它只是在按下按钮时将一行数据添加到表中。代码创建一个包含两个值的数组,然后调用 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 上调用 addRow(...) 方法

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

【讨论】:

  • ,我已经尝试过使用vector的那段代码,但是没有用。这是((DefaultTableModel) Tbl_Exp_Mgr.getModel()).insertRow(0, R_D);所以我删除了那部分。
  • 有什么想法,请告诉我。很紧急。我的大脑已经死了。
  • 我的表是空的。所以我不能使用`setValueAt(...)'方法。但是没有用
  • 我已经建议了 addRow(...) 方法。此外,如果您只有一列,为什么要使用 JTable。 JList 会更容易。无论如何,您还没有发布SSCCE,所以我无能为力。 SSCCE 的目的是简化问题。因此,创建一个带有 JTable 和一个复制按钮的框架来创建您的第二个 JTable/JList。完整的代码应该在 20-30 行代码左右。
  • 对不起先生,我的jTable在初始阶段共有5列0行。按下复制按钮后,表格动态添加行。然后获取第一个值(即ID),这样我就可以根据该 ID 从数据库中访问剩余详细信息。并填写该 jTable 中的剩余字段。[此处未解释]。感谢您的 SSCCE 知识。这对像我这样的新手非常有帮助。非常感谢您的帮助
【解决方案2】:

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

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

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

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

【讨论】:

  • ((DefaultTableModel) JTable.getModel()).addRow(Ary); 。我尝试了这段代码。但是这些值分散到整个列中。我需要单独 ROWS 中的所有值..
【解决方案3】:

我终于找到了实现目标的技巧.. 我创建了一个虚拟数组,然后在插入行数据之前调用数组值。之后我使用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());}
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2015-08-02
    • 2020-04-13
    相关资源
    最近更新 更多