доступ через поток - PullRequest
0 голосов
/ 22 июля 2011

В следующем коде я создал JTable в классе main и запускаю поток для сбора некоторого значения.Я хочу, чтобы это значение было обновлено в JTable, показанном в окне (то есть в JTable класса main).На самом деле я хочу, чтобы «а» в at (0,0) в следующем коде изменилось на «новое значение» в (0,0) после запуска этого кода.

Пожалуйста, помогите.

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

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

Во-первых, вы должны передать конструктору потока TableModel, который присоединен к сетке, а не новый:

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

И компоненты Swing не являются поточно-ориентированными, поэтому их использование всегда должно выполняться потоком диспетчеризации событий. Чтобы обновить ячейку, поток должен сделать что-то вроде этого:

final Object aa = "new value";
SwingUtilites.invokeLater(new Runnable() {
    public void run() {
        model.setValueAt(aa, 0, 0);
        System.out.println(model.getValueAt(0, 0));
    }
});
2 голосов
/ 22 июля 2011

Пожалуйста, передайте право MyTableModel в ваш поток, а не новый

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

В противном случае вы установите свое значение в совершенно другом объекте.

Это не похоже напроблема с потоками.Если это не работает, пожалуйста, попробуйте, если это работает, когда вы звоните

t.run();

вместо

t.start()

Кстати: найдите лучшее имя для вашего класса и дайте ему начатьс заглавной буквой в соответствии с Java Coding Conventions

1 голос
/ 22 июля 2011

Вы не хотите получать доступ к модели из другого потока, так как качание не безопасно.Смотри это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...