Note that there are some explanatory texts on larger screens.

plurals
  1. POJTable#repaint() not functioning as expected
    primarykey
    data
    text
    <p>This application pulls data from a text file and inserts it into <code>JTable</code>. An <code>Observer</code> is attached to check every 300 ms if there is a change to the file and reload the data. I have the <code>setChanged()</code> and <code>notifyObservers()</code> in my <code>Observer</code> class. </p> <p>When data is added to the table, a <code>getRowCount()</code> reports that the row was added, notifiers are operational. Virtually everything is working except for the <code>repaint()</code>. I have tried <code>revalidate()</code> and <code>fireTableDataChanged()</code> all to no avail. I would appreciate some help on this. No compile errors are reported throughout the process.</p> <p>Table Model</p> <pre><code>package HardwareDbFile; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.table.AbstractTableModel; public class HardwareFileTableModel extends AbstractTableModel{ protected Vector data; protected Vector columnNames ; protected String datafile; public HardwareFileTableModel(String file){ datafile = file; initVectors(); } public void initVectors() { String aLine ; data = new Vector(); columnNames = new Vector(); try { FileInputStream fin = new FileInputStream(datafile); try (BufferedReader br = new BufferedReader(new InputStreamReader(fin))) { StringTokenizer st1 = new StringTokenizer(br.readLine(), "|"); while(st1.hasMoreTokens()) { columnNames.addElement(st1.nextToken()); } // extract data while ((aLine = br.readLine()) != null) { StringTokenizer st2 = new StringTokenizer(aLine, "|"); while(st2.hasMoreTokens()) { data.addElement(st2.nextToken()); } } } } catch (Exception e) { e.printStackTrace(); } } @Override public int getRowCount() { return data.size() / getColumnCount(); } @Override public int getColumnCount(){ return columnNames.size(); } @Override public String getColumnName(int columnIndex) { String colName = ""; if (columnIndex &lt;= getColumnCount()) { colName = (String)columnNames.elementAt(columnIndex); } return colName; } @Override public Class getColumnClass(int columnIndex){ return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public Object getValueAt(int rowIndex, int columnIndex) { return (String)data.elementAt( (rowIndex * getColumnCount()) + columnIndex); } public void setValueAt(Object aValue, int rowIndex, int columnIndex) { } } </code></pre> <p>Observer Class</p> <pre><code>package HardwareDbFile; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.Timer; public class HardwareFileObserver extends Observable implements ActionListener { Timer time = new Timer(300,this); // check every 300ms long lastModified; String file ; HardwareFileObserver (String string) { file = string; File f = new File(file); lastModified = f.lastModified(); // original timestamp time.start(); } @Override public void actionPerformed(ActionEvent e) { File f = new File(file); long actualLastModified = f.lastModified(); if (lastModified != actualLastModified) { // the file have changed lastModified = actualLastModified; setChanged(); notifyObservers(); } } } </code></pre> <p>Main Class</p> <pre><code> public class HardwareInventoryUI extends javax.swing.JFrame implements Observer { private String datafile = "hardware.dat"; private String dataFilePath = "C:\\Windows\\Temp\\hardware.dat"; protected HardwareFileTableModel model; /** * Creates new form HardwareInventoryUI */ public HardwareInventoryUI() { initComponents(); model = new HardwareFileTableModel(dataFilePath); HardwareFileObserver fileWD; // this Observable object is monitoring any file change fileWD = new HardwareFileObserver(dataFilePath); fileWD.addObserver(this); } @Override public void update(Observable o, Object arg) { // reload data because data file have changed model.initVectors(); jTable.repaint(); } </code></pre> <p>Add Record Button</p> <pre><code> private void jAddRecordActionPerformed(java.awt.event.ActionEvent evt) { String toolID = jToolID.getText(); String toolName = jToolName.getText(); String quantity = jQuantity.getText(); String itemPrice = jItemPrice.getText(); try { model = new HardwareFileTableModel(dataFilePath); FileWriter fstream = new FileWriter(dataFilePath, true); try (BufferedWriter newRecord = new BufferedWriter(fstream)) { newRecord.newLine(); newRecord.write(toolID + "|"+ toolName + "|" + quantity + "|" + itemPrice ); } } catch (IOException ex) { Logger.getLogger(HardwareInventoryUI.class.getName()).log(Level.SEVERE, null, ex); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload