Импорт CSV в JTable на Jpanel (без CSVReader)

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

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

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

Когда я пытаюсь отладить программу, у меня нет проблем с переключением между двумя панелями jpanel (и другой информацией, которая находится на них), это просто моя таблица 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);
    }

}

Как узнать, что данные были добавлены в TableModel? Откуда вы знаете, что ваш метод ссылается на таблицу, отображаемую в графическом интерфейсе. Возможно, вы создали два экземпляра JTable.

camickr 03.12.2018 02:25

Это непростой вопрос, поскольку вы просите помощи в отладке кода, который мы не можем скомпилировать, запустить или протестировать. Если вы не получите решение в ближайшее время, рассмотрите возможность публикации действующей программы минимальный воспроизводимый пример в виде текста в формате кода (как вы это сделали с фрагментом кода здесь) с вашим вопросом. Это дает нам наилучшие шансы помочь разобраться в проблеме и ее решении.

Hovercraft Full Of Eels 03.12.2018 02:25

@camickr, хотя в моем приложении несколько таблиц, модель таблицы по умолчанию ссылается на таблицу 3, которая является единственной таблицей в панели, над которой я работаю ... если я что-то не пропустил?

Leemi 03.12.2018 02:29

@HovercraftFullOfEels обновленный код.

Leemi 03.12.2018 02:36

@Leemim, 1) Я тебе два вопроса задал. 2) ваш обновленный код по-прежнему нам ничего не говорит. а) мы не знаем, где вы создаете таблицу. б) это не «MCVE». Мы не можем скомпилировать / протестировать код, и у нас нет доступа к вашему файлу. Итак, в "MCVE" вы должны добавить в модель жестко закодированные данные. Как только вы докажете, что это работает, вы получите данные из файла. И в вашем "MCVE" нас не интересуют другие таблицы, а только та, которая вызывает проблему.

camickr 03.12.2018 02:41

Спасибо за дополнительный код, но я все еще понятия не имею, так как ваш опубликованный код еще недостаточно завершен, чтобы я мог его копировать, вставлять, компилировать и запускать, все требования для действительного MCVE. Нам не нужна ваша программа целиком, так как в ней будет много кода, который не имеет отношения к проблеме, но нам нужен код достаточно, достаточно, чтобы опубликованный код продемонстрировал нам проблему. Если вы все еще застряли, перечитайте ссылку MCVE и попробуйте еще раз. Да, это многого от вас требует, но обычно оно того стоит

Hovercraft Full Of Eels 03.12.2018 02:54

В дополнение к совету @HovercraftFullOfEels по созданию MCVE удалите файл внешних данных и замените его жестко закодированным String, который содержит всего две строки данных. BTW «Импорт CSV в JTable на Jpanel (без CSVReader)» К тому времени, когда вы добьетесь этого, у вас будет хотя бы простая программа для чтения CSV.

Andrew Thompson 03.12.2018 02:55

@Hovercraft Full Of Eels Спасибо всем за терпение. Я переделал пример про. Дайте мне знать, если это соответствует вашим потребностям. Ваша поддержка ценится.

Leemi 03.12.2018 03:31
Let me know if it suits your needs. - нет, потому что мы все еще не можем выполнить код по причинам, неоднократно указанным выше.
camickr 03.12.2018 05:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
9
289
1

Ответы 1

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

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

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

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

Например, ваш код изменился на 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);
    }
}

Спасибо за бесконечное терпение. Я проработаю этот пример над своим приложением.

Leemi 03.12.2018 14:13

Другие вопросы по теме