My question is, In my code I have made a JTable in main class. Now I am making a thread To do some task and to collect some data which i want to fill in the JTable as soon as the thread collects it. This thread should run for a while. So Can I access the JTable of main class through the Thread created.
EDIT: I’m providing my code here.
Test.java
package test;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
public class Test implements ActionListener {
Thread t;
JTable table;
JScrollPane scrollPane;
JButton b;
JFrame frame;
public void body() {
frame = new JFrame("TableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
table = new JTable(new MyTableModel());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
scrollPane = new JScrollPane(table);
frame.add(scrollPane);
b = new JButton("OK");
frame.add(b);
thread a = new thread(new MyTableModel());
t = new Thread(a);
frame.pack();
frame.setVisible(true);
b.addActionListener(this);
}
public static void main(String[] args) {
new Test().body();
}
@Override
public void actionPerformed(ActionEvent e) {
t.start();
}
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {
"First Name",
"Last Name",
"Sport"
};
private Object[][] data = {
{
"a",
"a",
"a"
}
};
@Override
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col < 3) {
return false;
} else {
return true;
}
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
thread.java
package test;
public class thread implements Runnable {
MyTableModel model;
thread(MyTableModel model){
this.model = model;
}
@Override
public void run() {
Object aa = "new value";
this.model.setValueAt(aa, 0, 0);
System.out.println(this.model.getValueAt(0, 0));
}
}
What I actually want is The value at 0,0 on the display screen of the JTable should Change from “a” to “new value”.
Please give some help.
When you create a thread you actually create a Runnable class, either by extending Thread or implementing Runnable. So you will have your own class such as this
Simply pass any objects you like to the constructor of this class