Pankaj Singhal
Pankaj Singhal

Reputation: 16043

access through thread

In the following code I've created a JTable in class main and I'm starting a thread to collect some value. I want that value to be updated in the JTable shown in the window(i.e. the JTable of class main). Actually I want "a" in the at (0,0) in the following code to change to "new value" at (0,0) after I run this code.

Please Help.

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));
    }       
}

Upvotes: 0

Views: 108

Answers (3)

powerMicha
powerMicha

Reputation: 2773

Please pass the right MyTableModel to your thread and not a new one

MyTableModel model = new MyTableModel();
...
table = new JTable(model);
...
thread a = new thread(model);

Otherwise you will set your value in a completely other object.

It looks not like a threading problem. If this does not work, please try if this does work when you call

t.run();

instead of

t.start()

By the way: find a better name for your class and let it start with an upper case letter as suggested by the Java Coding Conventions

Upvotes: 2

sbridges
sbridges

Reputation: 25150

You don't want to access the model from another thread as swing is not thread safe. See this

Upvotes: 1

Maurice Perry
Maurice Perry

Reputation: 32831

First, you should pass to the thread constructor the tableModel that is attached to the grid, not a new one:

MyTableModel model = new MyTableModel();
table = new JTable(model);
...
thread a = new thread(model);
t = new Thread(a);

And Swing components are not thread-safe, so their use must always be done by the event dispatch thread. To update the cell, the thread must do something like this:

final Object aa = "new value";
SwingUtilites.invokeLater(new Runnable() {
    public void run() {
        model.setValueAt(aa, 0, 0);
        System.out.println(model.getValueAt(0, 0));
    }
});

Upvotes: 2

Related Questions