【问题标题】:Iterate JTable in JTextArea在 JTextArea 中迭代 JTable
【发布时间】:2018-12-28 12:27:59
【问题描述】:

我想在jTextArea中迭代jTable

我试过这段代码:

int row = tableModel.getRowCount();

        for (int i = 0; i < row; i++) {
                jRcRprtTextArea.setText("___________________________________\n"
                        + "Item Name    Price   Qty.    Total\n"
                        + "_____________________________________________");
        jRcRprtTextArea.append("\n"
                + tableModel.getValueAt(i, 1)
                + "\t" + tableModel.getValueAt(i, 2)
                + "\t" + tableModel.getValueAt(i, 3)
                + "\t" + tableModel.getValueAt(i, 5)
        );
    }

但这不起作用
即使我尝试了 for 循环中的单行,但它也不是我想要实现的。
我期望jTextArea 必须包含来自jTable 的所有文本,就好像我将向jTable 添加新行一样。
以前的文本从jTextArea 消失,只是新添加的行文本添加到那里。 在这里,我可以看到所有行都使用println() 方法打印。
那么为什么它没有进入jTextArea

【问题讨论】:

    标签: java swing jtable jtextarea


    【解决方案1】:

    试试这个示例代码。它应该可以工作。

    重点是您需要在TableModelListener 中调用JTextArea.setText()。我已经更正了代码中的列索引。并且文本区域的标题被移出for循环。

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.DefaultTableModel;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class TableToTextArea
    {
      private static DefaultTableModel tableModel;
      private static JTextArea textArea = new JTextArea();
    
      public static void main(String[] args)
      {
        JButton button = new JButton("Add Row");
        button.addActionListener(new ActionListener()
        {
          @Override
          public void actionPerformed(ActionEvent e)
          {
            tableModel.addRow(new String[] {"Abc", "15", "2", "30"});
          }
        });
    
        JFrame f = new JFrame("Table to Text Area");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new GridLayout(3, 1));
        f.getContentPane().add(new JScrollPane(buildTable()));
        f.getContentPane().add(new JScrollPane(textArea));
        f.getContentPane().add(button);
        f.setBounds(300, 200, 500, 400);
        f.setVisible(true);
      }
    
      private static JTable buildTable()
      {
        tableModel = new DefaultTableModel(new String[0][0], new String[] {"Item Name", "Price", "Qty", "Total"});
        tableModel.addTableModelListener(new TableModelListener()
        {
          @Override
          public void tableChanged(TableModelEvent e)
          {
            int row = tableModel.getRowCount();
    
            textArea.setText("_____________________________________________\n"
                + "Item Name\tPrice\tQty.\tTotal\n"
                + "_____________________________________________");
            for (int i = 0; i < row; i++)
            {
              textArea.append("\n"
                  + tableModel.getValueAt(i, 0) // Column index is changed
                  + "\t" + tableModel.getValueAt(i, 1) // Column index is changed
                  + "\t" + tableModel.getValueAt(i, 2) // Column index is changed
                  + "\t" + tableModel.getValueAt(i, 3) // Column index is changed
              );
            }
          }
        });
        return new JTable(tableModel);
      }
    }
    

    【讨论】:

    • 感谢您的努力,但我仍然无法实现。我正在 NetBeans 中处理项目,即使我可以添加两行但也可以添加旧行。我尝试将其设置为空白,但仅添加当前行。在您的示例中,我们单击添加一行或多行可以添加两行。即使我可以得到相同的行为。我很高兴你的努力和时间。非常感谢。
    • 添加按钮将行添加到jTable,保存按钮将文本从行添加到jTextArea。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多