What I already have is a JTable
with a MyTableModel
table model attached to it. I have a tableChanged()
method that writes table data to a data.csv
file at the time a table cell is modified. This means that table data is written to the file every time user inputs new data. Instead I want there to be a menu item where user clicks 'Save' and then proceed with the code that saves to the file.
@Override
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
TableModel model = (TableModel) e.getSource();
String columnName = model.getColumnName(column);
Object data = model.getValueAt(row, column);
BufferedWriter bw = null;
FileWriter fw = null;
String rivi = "";
try {
fw = new FileWriter("data.csv");
bw = new BufferedWriter(fw);
for (int i = 0; i < model.getRowCount(); i++) {
for (int j = 0; j < model.getColumnCount(); j++) {
if (j == 69) {
rivi += model.getValueAt(i, j);
} else {
rivi += model.getValueAt(i, j) + ",";
}
}
if (i != 69) {
rivi += "\n";
}
}
bw.write(rivi);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
What I need, assuming I've understood correctly, is to move the file saving code from the tableChanged()
method to actionPerformed()
method, but I don't know how to get the TableModelEvent e
parameter from tableChanged()
method and use it in the actionPerformed()
method, so that I could get the table data via TableModel model = (TableModel) e.getSource()
and save it to the file.
@Override
public void actionPerformed(ActionEvent e) {
// File saving code here?
}
Full code here:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedWriter;
import java.io.FileWriter;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import static sun.misc.ClassFileTransformer.add;
public class DesktopEsimerkki extends JPanel
implements TableModelListener, ActionListener {
protected JTable table = null;
protected TableModel model = null;
public DesktopEsimerkki() {
super(new GridLayout(1, 0));
table = new JTable(new MyTableModel());
table.setFillsViewportHeight(true);
table.getModel().addTableModelListener(this);
add(new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
this.model = table.getModel();
}
@Override
public void tableChanged(TableModelEvent e) {}
@Override
public void actionPerformed(ActionEvent e) {
BufferedWriter bw = null;
String rivi = "";
FileWriter fw = null;
try {
fw = new FileWriter("data.csv");
bw = new BufferedWriter(fw);
for (int i = 0; i < model.getRowCount(); i++) {
for (int j = 0; j < model.getColumnCount(); j++) {
if (j == 69) {
rivi += model.getValueAt(i, j);
} else {
rivi += model.getValueAt(i, j) + ",";
}
}
if (i != 69) {
rivi += "\n";
}
}
System.out.println(rivi);
bw.write(rivi);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public JMenuBar luoValikkoPalkki() {
JMenuBar valikkopalkki = new JMenuBar();
JMenu valikko = new JMenu("File");
valikko.setMnemonic(KeyEvent.VK_F);
valikko.getAccessibleContext().setAccessibleDescription(
"File Saving MEnu");
valikkopalkki.add(valikko);
JMenuItem valikkoitem = new JMenuItem("Save", KeyEvent.VK_S);
valikkoitem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_S, ActionEvent.CTRL_MASK));
valikko.add(valikkoitem);
valikkoitem.addActionListener(this);
return valikkopalkki;
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"Col 1", "Col 2", "Col 3"};
private Object[][] data = {{"Data 1", "Data 2", "Data 3"}};
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
@Override
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("DesktopEsimerkki");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DesktopEsimerkki desim = new DesktopEsimerkki();
frame.setJMenuBar(desim.luoValikkoPalkki());
DesktopEsimerkki newContentPane = new DesktopEsimerkki();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}