0

.txt ファイルからテキストを読み取る JTable に取り組んでいます。txt ファイルは 3 秒後に動的に更新されます。アプリケーションを実行すると、.txt ファイルの出力が 2 行目から JTable に出力されることを除いて、すべて問題ありません。txt ファイルの最初の行が JTable に表示されません。誰でも助けることができますか?コードは次のとおりです。

public class InterfaceFrame extends JFrame implements ActionListener{

public static void main(String[] args) throws
URISyntaxException,
IOException,
InterruptedException {
    panel.setSize(100,100);
      panel.add(table);
      model.fireTableStructureChanged();

        table.setModel(model);
        InsertFileToJtable model = new InsertFileToJtable();
      table.setPreferredScrollableViewportSize(new Dimension(500, 70));
      table.setFillsViewportHeight(true);

      RowSorter<TableModel> sorter =
              new TableRowSorter<TableModel>(model);
            table.setRowSorter(sorter);

        JScrollPane scrollpane = new JScrollPane(table);
        panel.add(scrollpane, BorderLayout.CENTER);

        JButton button = new JButton("Show View");
        panel.add( button, BorderLayout.SOUTH );


        tabbedPane.addTab("Process",null,scrollpane,"");
}

テキストファイルを作成する際に何か間違ったことをしている可能性があります。.txt ファイルを生成したコードは次のとおりです。

import java.io.*;
import java.util.StringTokenizer;


public class GetProcessList
{

 private String GetProcessListData()
 {
 Process p;
 Runtime runTime;
 String process = null;
 try {
 System.out.println("Processes Reading is started...");

 //Get Runtime environment of System
 runTime = Runtime.getRuntime();

 //Execute command thru Runtime
 p=runTime.exec("ps -e");              //For Linux

 //Create Inputstream for Read Processes
 InputStream inputStream = p.getInputStream();
 InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
 BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

 //Read the processes from sysrtem and add & as delimeter for tokenize the output
 String line = bufferedReader.readLine();
 process = "&";
 while (line != null) {
 line = bufferedReader.readLine();
 process += line + "&";
 }

 //Close the Streams
 bufferedReader.close();
 inputStreamReader.close();
 inputStream.close();

 System.out.println("Processes are read.");
 } catch (IOException e) {
 System.out.println("Exception arise during the read Processes");
 e.printStackTrace();
}
    return process;
 }

 void showProcessData()
 {
 try {

 //Call the method For Read the process
 String proc = GetProcessListData();

 //Create Streams for write processes
 //Given the filepath which you need.Its store the file at where your java file.
 OutputStreamWriter outputStreamWriter =
 new OutputStreamWriter(new FileOutputStream("ProcessList.txt"));
 BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

 //Tokenize the output for write the processes
 StringTokenizer st = new StringTokenizer(proc, "&");

 while (st.hasMoreTokens()) {
 bufferedWriter.write(st.nextToken());  //Write the data in file
 bufferedWriter.newLine();               //Allocate new line for next line
 }

 //Close the outputStreams
 bufferedWriter.close();
 outputStreamWriter.close();

 } catch (IOException ioe) {
 ioe.printStackTrace();
 }

 }
}

ProcessList.txt を読み取って JTable に出力するコードを次に示します。

import java.io.*;
import java.awt.*;
import java.util.*;import javax.swing.*;
import java.awt.event.*;
import javax.swing.table.*;

public class InsertFileToJtable extends AbstractTableModel{
Vector data;
Vector columns;
private String[] colNames = {"<html><b>PID</b></html>","<html><b>TTY</b</html>",<html>  <b>time</b></html>","<html><b>Process Name</b></html>",};


public InsertFileToJtable() {
String line;
data = new Vector();
columns = new Vector();
  try {
        FileInputStream fis = new FileInputStream("ProcessList.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
        StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
        while (st1.hasMoreTokens())
                columns.addElement(st1.nextToken());
        while ((line = br.readLine()) != null) {
                StringTokenizer st2 = new StringTokenizer(line, " ");
                while (st2.hasMoreTokens())
                       data.addElement(st2.nextToken());
        }
        br.close();
} catch (Exception e) {
        e.printStackTrace();
}  

}

public int getRowCount() {
return data.size() / getColumnCount();
}

public int getColumnCount() {
return columns.size();
}

public Object getValueAt(int rowIndex, int columnIndex) {
return (String) data.elementAt((rowIndex * getColumnCount())
                + columnIndex);
}
@Override
public String getColumnName(int column) {
return colNames[column];
}
@Override
public Class getColumnClass(int col){
return getValueAt(0,col).getClass();
}
}   
4

1 に答える 1

2

中間のテキスト ファイルを避けて、これを少し違った方法で行います。その代わり、

  • ProcessBuilder「同じインスタンスから繰り返し呼び出すことができる」 を使用します。ここに示すように出力を読み取り、適切なデータ構造に解析できますList<List<String>>

    ProcessBuilder pb = new ProcessBuilder("ps -ef");
    
  • javax.swing.Timer3 秒間のピリオドを開始します。pb.start()タイマーのリスナーで呼び出します。

  • 解析が終了fireTableDataChanged()すると、ここAbstractTableModelに表示される.

さきほど、テーブルは 3 秒ごとに最新の結果で更新されます。

于 2012-12-01T14:48:54.777 に答える