JTable从第二行读取文本文件 [英] JTable reading text files from second line

查看:131
本文介绍了JTable从第二行读取文本文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究从.txt文件中读取文本的JTable。 txt文件在3秒后动态更新。现在,当我运行应用程序时,除了第二行的.txt文件的输出来自JTable之外,一切都很好。 txt文件的第一行不会出现在我的JTable上。谁能帮忙?这里是代码:

pre $ public元素接口框架扩展JFrame实现ActionListener {

public static void main(String [] args)抛出
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
{
$ b $ private String GetProcessListData()
{
Process p;
运行时runTime;
String process = null;
尝试{
System.out.println(进程读取已经开始...);

//获取系统运行时环境
runTime = Runtime.getRuntime();

//通过运行时执行命令
p = runTime.exec(ps -e); //对于Linux

//为读取进程创建InputStream
InputStream inputStream = p.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

//从sysrtem读取进程并添加&作为标记输出的分界符
String line = bufferedReader.readLine();
process =&;
while(line!= null){
line = bufferedReader.readLine();
process + = line +&;
}

//关闭流
bufferedReader.close();
inputStreamReader.close();
inputStream.close();

System.out.println(读取进程);
catch(IOException e){
System.out.println(在读进程中出现异常);
e.printStackTrace();
}
返回过程;

$ b $ void showProcessData()
{
try {

//调用方法For Read the process
String proc = GetProcessListData();

//为写入过程创建流
//给出你需要的文件路径。它将文件存储在你的java文件的地方。
OutputStreamWriter outputStreamWriter = $ b $ new OutputStreamWriter(new FileOutputStream(ProcessList.txt));
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

//将输出的Tokenize写入进程
StringTokenizer st = new StringTokenizer(proc,&); $()。

while(st.hasMoreTokens()){
bufferedWriter.write(st.nextToken()); //将数据写入文件
bufferedWriter.newLine(); //为下一行分配新行
}

//关闭outputStreams
bufferedWriter.close();
outputStreamWriter.close();
$ b $ catch(IOException ioe){
ioe.printStackTrace();



$ b code
$ b $ p
$ b

读取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;
向量列;
private String [] colNames = {< html>< b> PID< / b>< / html>,< html>< b> TTY< / b< / html> ,< HTML> < b>< b>< b>< html>< b>程序名称< / b>< / html>,$;


public InsertFileToJtable(){
String line;
data = new Vector();
列= 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 = (st2.hasMoreTokens())
data.addElement(st2.nextToken());
}
br.close() ;
} catch(Exception e){
e.printStackTrace();
}

}

public int getRowCount(){
返回data.size()/ getColu mnCount();


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



$ div $解析方案

'做这个有点不同,避免中间文本文件。相反,使用 ProcessBuilder ,可以重复调用


  • 同样的事例。您可以阅读此处所示的输出,并将其解析为合适的数据结构,例如, List< List< String>>

      ProcessBuilder pb = new ProcessBuilder(ps -ef); 


  • 开始 javax.swing.Timer pb.start()

  • 解析结束时,<$ c $在 AbstractTableModel 中显示fireTableDataChanged(),如在这里


    Presto,表格每三秒更新一次最新结果。


  • I'm working on JTable that reads text from a .txt file. the txt file gets updated dynamically after 3 sec. Now when I run the application, everything is good except that the output of .txt files comes in JTable from the second line. The first line of txt file doesn't appear on my JTable. Can anyone help? Here's the code:

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

    I might be doin something wrong in making the text file. Here's the code which generated the .txt file.:

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

    Heres the code that reads ProcessList.txt and gives output into 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();
    }
    }   
    

    解决方案

    I'd do this a little differently, avoiding an intermediate text file. Instead,

    • Use ProcessBuilder, which "can be invoked repeatedly from the same instance." You can read the output as shown here and parse it into a suitable data structure, e.g. List<List<String>>.

      ProcessBuilder pb = new ProcessBuilder("ps -ef");
      

    • Start a javax.swing.Timer having a three second period; invoke pb.start() in the timer's listener.

    • When parsing concludes, fireTableDataChanged() in your AbstractTableModel, shown here.

    Presto, your table updates with the latest result every three seconds.

    这篇关于JTable从第二行读取文本文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆