I have a timer class updating my table but the only way I have found to affect a change is to use this code. It is essentially a break time application. I am using ini4j to read an ini file on the network. It does work but it's creating speed issues with other things I am doing. With the current setup it shows the times more or less correctly but start to lag when I add more people. If you answer is learn jTables that's not going to be helpful lol. I havn't been able to get this to work using jtables and fireupdate changes.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import main.Break;
import org.ini4j.InvalidFileFormatException;
import org.ini4j.Wini;
public class TableUpdate extends JLabel implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 4357754555235469274L;
private volatile static boolean running = true;
SimpleDateFormat UTC = new SimpleDateFormat("HH:mm:ss");
Timer breaktimer = new Timer(1000, this);
public static long now = System.currentTimeMillis();
final static String local = ConfigIni.location();
final static File FILENAME = new File(local+"\\master.ini");
@Override
public void actionPerformed(ActionEvent arg0) {
Runnable runnable = new Runnable() {
public void run() {
tableupdate();
}};
SwingUtilities.invokeLater(runnable);
}
public void tableupdate() {
UTC.setTimeZone(TimeZone.getTimeZone("UTC"));
Wini ini = null;
try {
ini = new Wini(FILENAME);
} catch (InvalidFileFormatException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
String number = ini.get("analysts", "number");
if (number.equals("8")) {
Break.jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{AnalystIni.one(), StartIni.one(), BreakIni.one(), TypeIni.one()},
{AnalystIni.two(), StartIni.two(), BreakIni.two(), TypeIni.two()},
{AnalystIni.three(), StartIni.three(), BreakIni.three(), TypeIni.three()},
{AnalystIni.four(), StartIni.four(), BreakIni.four(), TypeIni.four()},
{AnalystIni.five(), StartIni.five(), BreakIni.five(), TypeIni.five()},
{AnalystIni.six(), StartIni.six(), BreakIni.six(), TypeIni.six()},
{AnalystIni.seven(), StartIni.seven(), BreakIni.seven(), TypeIni.seven()},
{AnalystIni.eight(), StartIni.eight(), BreakIni.eight(), TypeIni.eight()},
},
new String [] {
"Analyst", "Start Time", "Timer", "Status"
}
));
}
}
public void start() {
running = true;
breaktimer.start();
}
public void stop() {
running = false;
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
TableUpdate jtl = new TableUpdate();
jtl.start();
}
});
}
}
Here is the code for my table
try {
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{AnalystIni.one(), StartIni.one(), BreakIni.one(), TypeIni.one()},
{AnalystIni.two(), StartIni.two(), BreakIni.two(), TypeIni.two()},
{AnalystIni.three(), StartIni.three(), BreakIni.three(), TypeIni.three()},
{AnalystIni.four(), StartIni.four(), BreakIni.four(), TypeIni.four()},
{AnalystIni.five(), StartIni.five(), BreakIni.five(), TypeIni.five()},
{AnalystIni.six(), StartIni.six(), BreakIni.six(), TypeIni.six()},
{AnalystIni.seven(), StartIni.seven(), BreakIni.seven(), TypeIni.seven()},
{AnalystIni.eight(), StartIni.eight(), BreakIni.eight(), TypeIni.eight()}
},
new String [] {
"Analyst", "Time Started", "Timer", "Status"
}
));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JTableHeader header = jTable1.getTableHeader();
header.setBackground(SettingsIni.jtable1h());
header.setForeground(SettingsIni.jtable1ht());
jTable1.setBackground(SettingsIni.jtable1());
jTable1.setForeground(SettingsIni.jtable1t());
jTable1.setOpaque(false);
jScrollPane1.setViewportView(jTable1);
jScrollPane1.setOpaque(false);
jTable1.setFocusable(false);
//jScrollPane1.setBorder(BorderFactory.createMatteBorder(0,1,0,0,Color.black));
jScrollPane1.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
jScrollPane1.getViewport().setOpaque(false);
final Color jcolor1 = new Color(0, true);
jScrollPane1.getViewport().setBackground(jcolor1);
getRootPane().setBorder(BorderFactory.createEmptyBorder(0,0,0,0));//removed border
I have added this code to the class with the table.
@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);
}
And I am looking at adding this to my timer, but it still feels like I am missing something.
BreakTimev21.jTable1.tableChanged(new TableModelEvent(BreakTimev21.jTable1.getModel()));
From camickr I tried this in my tableupdate class. Still didn't help, it does update but is kinda glitchy. I did remember to use jTable1.setAutoCreateColumnsFromModel(false);
Object [][] data = {
{a1, StartIni2.one(), BreakIni2.one(), TypeIni2.one()},
{a2, StartIni2.two(), BreakIni2.two(), TypeIni2.two()},
{a3, StartIni2.three(), BreakIni2.three(), TypeIni2.three()},
{a4, StartIni2.four(), BreakIni2.four(), TypeIni2.four()},
{a5, StartIni2.five(), BreakIni2.five(), TypeIni2.five()},
{a6, StartIni2.six(), BreakIni2.six(), TypeIni2.six()},
{a7, StartIni2.seven(), BreakIni2.seven(), TypeIni2.seven()},
{a8, StartIni2.eight(), BreakIni2.eight(), TypeIni2.eight()},
};
String [] columnNames = {
"Analyst", "Start Time", "Timer", "Status"
};
TableModel model = BreakTimev21.jTable1.getModel();
((DefaultTableModel) model).setDataVector(data, columnNames);
I stopped using ini4j for the read part of tableupdate and just used java properties, which helped witht he speed a lot but still did not resolve. setDataVector works just as well as BreakTimev21.jTable1.setValueAt(StartIni2.one(), 0, 1);
StartIni2 uses java properties now instead of ini4j.
First of all you should not be extending JLabel to implement the TableUpdate class.
There is no reason you can't use the DefaultTableModel. When you want to change existing data in the model all you do is invoke:
model.setValueAt(...)
and the table will repaint the cell automatically.
So when the Timer fires and its time to update the table you could just create your 2-dimensional array with the new data. Then you loop through the array and compare the value in the array with the value in the model. When you find a difference you update the model as I suggested above.
Or an alternative approach is to keep using your existing model and replace all the data in the model with the data in the array by using the setDataVector() method of DefaultTableModel.
If you use this second approach then after you initial create the JTable you will want to use:
table.setAutoCreateColumnsFromModel(false);
This will make updating of the model faster since it just updates the data and won't recreate all the TableColumns etc.
Using either of the approaches here there is no need for you to play with the tableChanged() method.