2011-07-21 109 views
0

我的問題是,在我的代碼中,我在主類中創建了一個JTable。現在我正在創建一個線程完成一些任務,並收集一些數據,只要線程收集它們就可以填充JTable。這個線程應該運行一段時間。所以我可以通過創建的線程訪問主類的JTable。通過線程訪問父類對象

編輯:我在這裏提供我的代碼。

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

} 

什麼其實我是想在0,0 JTable的顯示屏幕上的價值應該從「一個「到」新價值「。

請給予一些幫助。

+0

一些示例代碼? –

回答

2

當您創建一個線程時,您實際上創建了一個Runnable類,可以通過擴展Thread或實現Runnable來實現。所以,你將有自己的類,如本

MyClass implements Runnable { 
    public void run() { ... your work here ... } 
} 

只要你喜歡的任何對象傳遞給這個類

MyClass implements Runnable { 


    JTable m_jtable; 

    public MyClass(JTable theTable) { m_jtable = theTable; } 

    public void run() { do things with m_jtable } 
} 
+0

我做到了這一點,但我用m_jtable所做的工作僅僅反映了這一點。 這並不反映在我傳入MyClass的實際對象中,這就是我想要的。 請幫助。 –

+0

我已經提供了我的代碼。請看看它。 –

0

它已經有一段時間我一直在做Swing編程的構造函數,但你可能想讓你的線程更新表的模型,而不是搞亂JTable本身。在任何情況下,它都會有一個模型,不管你是否創建它。

所以,你應該有一個正在收集數據的線程具有對模型參考,一旦採集完成,火一些事件,纔能有更新表(例如http://download.oracle.com/javase/7/docs/api/javax/swing/table/AbstractTableModel.html#fireTableDataChanged())。

您應該避免亂拋垃圾代碼,並且需要公開引用應用程序的內部函數,即不要將表/模型作爲公共變量提供。知道你的物體在哪裏生活,它保持整潔。

編輯:

所以,你將有你的模型:

public class MyModel extends AbstractTableModel { 
    private ClassDescribingYourData data; 

    public void update(ClassDescribingYourData data) { 
     this.data = data; 
     fireTableDataChanged(); 
    } 
} 

而且您的數據採集器:

public class DataCollector implements Runnable { 
    private final MyModel model; 

    public DataCollector(MyModel model) { 
     this.model = model; 
    } 

    public void run() { 
     //1. collect data 
     collectedData = .. 
     //2. update model 
     this.model.update(collectedData); 
    } 
} 

到那時,你可以選用一些執行人或者乾脆:

DataCollector collector = new DataCollector(referenceToYourModel); 
new Thread(collector).start(); 

以上不是一個完整的實現,但我希望它解釋了這個想法。

+0

你能告訴我,我怎樣才能讓我的線程參考模型。 –

+0

我用僞java更新了我的答案,關於邏輯將如何發展。 – merryprankster

+0

謝謝。此信息有所幫助。 –