Импорт CSV в JTable на Jpanel (без CSVReader) - PullRequest
0 голосов
/ 03 декабря 2018

Быстрый вопрос:

Я пытаюсь импортировать некоторую информацию из CSV в jtable, который находится на панели свинга в моей программе.

Я импортировал информацию в actionListener с помощью inputtream и проанализировал ее с помощью bufferedreader.Я просто использовал простой цикл while для добавления в Jtable.однако, когда я запускаю приложение, в моем jtable не отображается никакой информации.

Когда я пытаюсь отладить программу, у меня нет проблем с переключением между двумя jpanels (и другой информацией, которая на них есть), это просто моя jtable, которая отображается пустой.

Вот мой код:

public class wert extends JFrame {

    private JPanel contentPane;
    private JPanel panel;
    private JTable table;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    wert frame = new wert();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public wert() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 925, 486);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                try {
                    Path filePath = Paths.get("\\test folder\\newNeetest.csv\\");
                    InputStream input = null;

                    input = Files.newInputStream(filePath);
                     BufferedReader reader = new BufferedReader (new InputStreamReader(input));

                     DefaultTableModel model = (DefaultTableModel)table.getModel();

                    Object [] lines = reader.lines().toArray();

                    for (int q =0; q > lines.length; q++) {
                        String dsa = lines[q].toString();
                        String [] dataRow = dsa.split(",");
                        model.addRow(dataRow);
                    }
                    } 


                catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }



            }
        );
        contentPane.add(btnNewButton, BorderLayout.NORTH);

        panel = new JPanel();
        contentPane.add(panel, BorderLayout.CENTER);

        table = new JTable();
        GroupLayout gl_panel = new GroupLayout(panel);
        gl_panel.setHorizontalGroup(
            gl_panel.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_panel.createSequentialGroup()
                    .addGap(475)
                    .addComponent(table, GroupLayout.PREFERRED_SIZE, 230, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(188, Short.MAX_VALUE))
        );
        gl_panel.setVerticalGroup(
            gl_panel.createParallelGroup(Alignment.LEADING)
                .addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(table, GroupLayout.DEFAULT_SIZE, 0, Short.MAX_VALUE)
                    .addGap(375))
        );
        panel.setLayout(gl_panel);
    }

}

1 Ответ

0 голосов
/ 03 декабря 2018

Несколько проблем с вашим опубликованным кодом:

  1. Прежде всего, для этого требуется внешний файл, к которому мы не имеем никакого отношения.К счастью, это можно преодолеть
  2. Вы не помещаете свой JTable в JScrollPane.Панели прокрутки идеально подходят для отображения полной таблицы JTable, включая заголовки столбцов.
  3. Вы используете GroupLayout, в этом нет необходимости, и, что более важно, возможно, вы все испортите, поскольку это ограничивает визуализацию вашей таблицы
  4. Вы не даете своей JTable достойную модель таблицы, однус заголовками столбцов, поэтому, когда вы добавляете в него новые данные, модель запутывается и может не знать, сколько столбцов нужно отобразить

Предложения:

  • Поместить таблицу вa JScrollPane
  • Поместите JScrollPane BorderLayout.CENTER - для этого будет хорошо работать JPP-панель содержимого.
  • Дайте JTable достойную модель.Даже самый простой DefaultTableModel, один с String array заголовка столбца и int, 0, для числа начальных строк.
  • Убедитесь, что длина String array заголовка столбца - фактическое число необходимых столбцов

Например, ваш код изменился на MCVE, который работает:

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class Wert2 extends JFrame {

    private JPanel contentPane;
    private JTable table;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Wert2 frame = new Wert2();
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Wert2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // file I/O code removed for sake of MCVE
                DefaultTableModel model = (DefaultTableModel) table.getModel();
                for (int i = 0; i < 10; i++) {
                    Vector<String> rowData = new Vector<>();
                    for (int j = 0; j < 3; j++) {
                        rowData.add(String.format("[%d, %d]", i, j));
                    }
                    model.addRow(rowData);
                }
            }

        });
        contentPane.add(btnNewButton, BorderLayout.NORTH);

        // contentPane.add(panel, BorderLayout.CENTER);
        String[] colNames = {"A", "B", "C"};
        table = new JTable(new DefaultTableModel(colNames, 0));
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        contentPane.add(scrollPane);
    }
}
...