Pergunta

Eu tenho dados CSV (na verdade, os valores são separados por um caractere de tabulação, mas eu posso usar ; como separador). Os dados são armazenados em um objeto String.

Existe maneira simples de criar uma JTable com esses dados (sem fazê-lo manualmente através da leitura e análise do objeto String)?

(nota: o meu projeto está usando Java 1.4, mas se você tiver uma solução que precisa de Java 1.5, que seria de qualquer maneira feliz)

Foi útil?

Solução

O TableModelExtTextLoader de swinglabs que você vai fazer. Ele suporta tanto guia e separados por vírgula texto.

Outras dicas

É fácil o suficiente para fazer isso sem uma biblioteca externa. Aqui está um exemplo usando a classe Scanner de Java 1.5:

 import java.io.*;
 import java.net.URL;
 import java.util.Scanner;
 import javax.swing.*;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.DefaultTableModel;

 public class CSVTable extends JFrame {
    JTable table;
    DefaultTableModel model;
    JButton closeButton, webButton;
  /**
   * Takes data from a CSV file and places it into a table for display.
   * @param source - a reference to the file where the CSV data is located.
   */
  public CSVTable(String title, String source) {
    super(title);
    table = new JTable();
    JScrollPane scroll = new JScrollPane(table);
    String[] colNames = { "LastName", "FirstName", "Email Address", "Dept."};
    model = new DefaultTableModel(colNames, 0);
    InputStream is;
    try {
        if(source.indexOf("http")==0) {
            URL facultyURL = new URL(source);
            is = facultyURL.openStream();
        }
        else { //local file?
            File f = new File(source);
            is = new FileInputStream(f);
        }
        insertData(is);
        //table.getColumnModel().getColumn(0).setCellRenderer(new CustomCellRenderer());
    }
    catch(IOException ioe) {
        JOptionPane.showMessageDialog(this, ioe, "Error reading data", JOptionPane.ERROR_MESSAGE);
    }

    JPanel buttonPanel = new JPanel();
    closeButton = new JButton("Close");
    webButton = new JButton("Proctinator.com");
    buttonPanel.add(closeButton);
    buttonPanel.add(new JLabel("   You can download this file from our site: "));
    buttonPanel.add(webButton);

    JPanel notesPanel = new JPanel();
    JLabel note1 = new JLabel(" Make sure that your list is formatted exactly as shown below, including the *markers between categories ");
    JLabel note2 = new JLabel(" Be sure to place each faculty member into the correct category: *Teacher, *Subs, *TeacherAids, *TeacherAssistants ");
    JLabel note3 = new JLabel(" Note that the your faculty list must be a plain text file:  Export to either CSV or tab delimited format.");
    BoxLayout layout = new BoxLayout(notesPanel, BoxLayout.Y_AXIS);
    notesPanel.setLayout(layout);
    notesPanel.add(note1);
    notesPanel.add(note2);
    notesPanel.add(note3);       
    getContentPane().add(notesPanel, BorderLayout.NORTH);
    getContentPane().add(scroll, BorderLayout.CENTER);
    getContentPane().add(buttonPanel, BorderLayout.SOUTH);
    pack();
}

/**
 * Places the data from the specified stream into this table for display.  The data from the file must be in CSV format
 * @param is - an input stream which could be from a file or a network connection or URL.
 */
void insertData(InputStream is) {
    Scanner scan = new Scanner(is);
    String[] array;
    while (scan.hasNextLine()) {
        String line = scan.nextLine();
        if(line.indexOf(",")>-1)
            array = line.split(",");
        else
            array = line.split("\t");
        Object[] data = new Object[array.length];
        for (int i = 0; i < array.length; i++)
            data[i] = array[i];

        model.addRow(data);
    }
    table.setModel(model);
} 

public static void main(String args[]) {
    CSVTable frame = new CSVTable("Faculty List Example","http://proctinator.com/help/faculty.csv");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

a menos que haja um arquivo CSV -.> Método TableModel lá fora em algum lugar você terá que escrever o código para preencher o modelo de si mesmo, infelizmente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top