2011-07-21 4 views
0

私の質問では、私はメインクラスでJTableを作っています。今、私はスレッドを作っています。いくつかのタスクを実行し、スレッドが収集するとすぐにJTableに書きたいデータを収集します。このスレッドはしばらく実行する必要があります。したがって、作成されたスレッドを通じてメインクラスのJTableにアクセスできますか?スレッドを介して親クラスオブジェクトにアクセスする

編集:私はここに自分のコードを提供しています。

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

} 

thread.java

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

} 

私が実際にしたい何のJTableの表示画面上の0,0の値が "から変更する必要がありますa "を"新しい値 "に変更します。

お願いします。

+0

いくつかのサンプルコード? –

答えて

2

スレッドを作成するときは、実際にRunnableクラスを作成します。スレッドを拡張するか、Runnableを実装します。だから、あなたは、単にそれは私がSwingのプログラミングを行ってきたしばらくしている

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

このクラスのコンストラクタに、好きなオブジェクトを渡すように、この

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

として独自のクラスを持っていますが、あなたでしょうおそらく、あなたのスレッドをJTable自体を使いこなすのではなく、テーブルを更新したいと思っています。いずれにしても、作成するかどうかにかかわらず、モデルが作成されます。

は、だから、データを収集しているスレッドがモデルへの参照を持っていて、収集が行われた後、テーブルを更新しているために、いくつかのイベントを発生すべきである(例えばhttp://download.oracle.com/javase/7/docs/api/javax/swing/table/AbstractTableModel.html#fireTableDataChanged用())。

あなたのアプリケーションの内部へのパブリックリファレンスでコードを捨てる必要はありません。つまり、あなたのテーブル/モデルをパブリック変数としてどこかに用意する必要はありません。あなたのオブジェクトがどこに住んでいるか知っている、それは物事をきれいに保つ。

EDIT:

ですから、あなたのモデルを持っているでしょう:

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

ありがとうございます。この情報は役に立ちました。 –

関連する問題