Я новичок в языке Java ... Я хочу отображать записи из базы данных Mysql в JTable ... Но я получаю только одну строку ... Я понятия не имею, где я ошибаюсь. Любая помощь будет очень признательна.

Мой код:

package test;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.sql.*;
import net.proteanit.sql.DbUtils;

class Test {
    JFrame frame;
    Container pane;
    JTable table;
    Connection con;
    Statement sth;
    ResultSet rs;

    public void connect () {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/SMS", "root", "phplover");
        } catch (Exception e) {
            System.out.println("Conection failed. " + e);
        }
    }

    public void initGUI () {
        frame = new JFrame();
        frame.setVisible(true);
        frame.setBounds(100, 100, 500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        pane = frame.getContentPane();
    }

    public void fetchRecords () {
        try {
            sth = con.createStatement();
            rs = sth.executeQuery("SELECT * FROM `students`");

            while (rs.next()) {
                String name = rs.getString("name");
                String fname = rs.getString("fname");
                String age = rs.getString("age");

                String cols[] = {"Name", "Father's Name", "Age"};
                String rows[][] = {
                    {name, fname, age}
                };
                table = new JTable(rows, cols);
                pane.add(new JScrollPane(table));
            }

        } catch (Exception e) {
            System.out.println("An error occured. " + e);
        }
    }

    public static void main (String args[]) {
        Test obj = new Test();
        obj.connect();
        obj.initGUI();
        obj.fetchRecords();
    }

}
1
Crazy Coder 15 Июл 2017 в 08:13
Вы добавляете новую панель JScrollPane для каждой строки?
 – 
gmanjon
15 Июл 2017 в 08:17
Вы инициализируете JTable каждую итерацию в цикле while. Вам нужно вынести его наружу.
 – 
user5549921
15 Июл 2017 в 08:17
@finnrayment, не могли бы вы объяснить в ответ?
 – 
Crazy Coder
15 Июл 2017 в 08:24
Подожди, дай мне отладчик кода, попробую сам.
 – 
user5549921
15 Июл 2017 в 08:25
@finnrayment, жду вашего ответа ..!
 – 
Crazy Coder
15 Июл 2017 в 08:32

1 ответ

Лучший ответ

Ваша проблема в основном заключается в том, что, перебирая базу данных, вы каждый раз создаете новый JTable. В приведенном ниже примере я не только исправил вашу проблему, но и улучшил ее .

Несколько указателей:

  1. Не используйте getContentPane(), создайте JPanel и задайте ему макет. Для вас я выбрал BorderLayout, вы можете выбрать свой, если хотите.
  2. Не используйте setBounds() в JFrame. Черт, никогда не используйте его на ЛЮБОМ компоненте Swing. Вот несколько веских причин, почему .
  3. Используйте JFrame.setDefaultLocationRelativeTo(null), чтобы разместить его в центре экрана. Я считаю, что это то, что вы делали с setBounds().
  4. Используйте JFrame.setVisible(true) после инициализации фрейма. В противном случае он будет прыгать повсюду, так как все будет добавлено.

И, наконец, код:

public class Test {
    JFrame frame;
    JPanel window;
    JTable table;
    JScrollPane scrollPane;

    Connection con;
    Statement sth;
    ResultSet rs;

    public void connect () {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/SMS", "root", "phplover");
        } catch (Exception e) {
            System.out.println("Conection failed. " + e);
        }
    }

    public void initGUI () {
        frame = new JFrame();
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        window.setLayout(new BorderLayout());
        frame.add(window);

        scrollPane = new JScrollPane(table);

        // USE THIS ONE IF YOU WANT YOUR SCROLL BARS TO ALWAYS BE VISIBLE!
        //scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        window.add(scrollPane, BorderLayout.CENTER);

        frame.setVisible(true);
    }

    public void fetchRecords () {
        try {
            sth = con.createStatement();
            rs = sth.executeQuery("SELECT * FROM `students`");

            String[] columns = {"Name", "Father's Name", "Age"};

            List<Object[]> sets = new ArrayList<Object[]>();
            while (rs.next()) {
                String name = rs.getString("name");
                String fname = rs.getString("fname");
                String age = rs.getString("age");

                sets.add(new String[]{name, fname, age});
            }
            table = new JTable(sets.toArray(new Object[sets.size()][]), columns);
        } catch (Exception e) {
            System.out.println("An error occured. " + e);
        }
    }

    public static void main (String args[]) {
        Test obj = new Test();
        obj.connect();
        obj.fetchRecords(); // Notice I swapped the order between this and initGUI.
        obj.initGUI();      // The program will break if you have it the other way around as the
                            // JTable will throw a NullPointerException.
    }
}

Примечание. Это инициализирует JTable в процессе выборки записи. Вы можете редактировать его в любое время, но, снова вызвав fetchRecords(), он обновит его через базу данных. Очень полезно для загрузки новых данных, но удалит все данные, которые вы добавили в себя, если вы сначала не внесете эти изменения в свою базу данных.

0
user5549921user5549921 15 Июл 2017 в 09:15
Он показывает ошибку "ссылка на список неоднозначна" .. Я импортировал "java.awt. *" И "java.util. *"
 – 
Crazy Coder
15 Июл 2017 в 10:50
Ваш ответ заслуживает принятия. И еще кое-что .. Не могли бы вы вкратце объяснить «table = new JTable (sets.toArray (new Object [sets.size ()] []), columns);»?
 – 
Crazy Coder
15 Июл 2017 в 11:32
Извините, ваш последний комментарий не появился. Позвольте мне это проверить. Кроме того, не принимайте мой ответ, если он действительно не помогает! :)
 – 
user5549921
15 Июл 2017 в 11:32
Этот фрагмент кода преобразует динамический List одномерных массивов String в один двухмерный массив String. От List<String[]> до String[][].
 – 
user5549921
15 Июл 2017 в 11:34
Список, который вы ищете, это java.util.List и java.util.ArrayList, оба они должны быть импортированы.
 – 
user5549921
15 Июл 2017 в 11:34