在 JTextArea 中迭代 JTable
Iterate JTable in JTextArea
我想在 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
?
试试这个示例代码。它应该有效。
要点是你需要在TableModelListener
中调用JTextArea.setText()
。我已经更正了您代码中的列索引。并将文本区域的headers移出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);
}
}
我想在 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
?
试试这个示例代码。它应该有效。
要点是你需要在TableModelListener
中调用JTextArea.setText()
。我已经更正了您代码中的列索引。并将文本区域的headers移出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);
}
}