Как отобразить данные из базы данных SQL в JTable, привязанной к MVC? - PullRequest
0 голосов
/ 02 октября 2018

Итак, я пытаюсь заполнить JTable данными из базы данных.В Интернете есть много информации об этом, как на YouTube, так и здесь, на SO.Моя проблема, однако, состоит в том, что все решения, которые я могу найти, пишут весь код в классе представления (приложение Swing), что мне запрещено делать (школьное задание).

Моя проблема в том, что я не могу разделитьдо кода в соответствии с MVC и до сих пор его функции.Мой метод получения конкретного студента из моей базы данных таков:

public Student getOneSpecificStudent(int studentID) throws SQLException {

    Connection con = null;
    PreparedStatement stm = null;

    try {
        con = DatabaseConnection.getConnection();
        stm = con.prepareStatement("SELECT * FROM Student WHERE studentID = 
        ?");
        stm.setInt(1, studentID);

        ResultSet rs = stm.executeQuery();

        Student student = null;
        while (rs.next()) {
            student = new Student(rs.getInt("studentID"), 
rs.getString("studentSSN"), rs.getString("studentName"), 
rs.getString("studentAddress"), rs.getString("studentPhoneNumber"));

        }
        return student;
    } finally {
        DbUtils.close(con);
        DbUtils.close(stm);
    }
}

, а мой метод Контроллера такой:

public Student getOneSpecificStudent(int studentID) throws SQLException {
    Student student = tmpDAL.getOneSpecificStudent(studentID);
    return student;

}

Но как мне узнать, отображать ли это в Jtable?Я использовал Object [] с уже заполненными данными раньше, но это оставляет меня в тупике.Есть идеи?

1 Ответ

0 голосов
/ 02 октября 2018

Поскольку Swing уже поддерживает MVC (в обратном порядке), вам следует начать с TableModel, чтобы обернуть существующие данные.

Данные из базы данныхуже смоделированный в классе Student, который является хорошим местом для начала, вам просто нужно создать TableModel, который обтекает его.Вы должны начать с рассмотрения Как использовать таблицы

Начиная с базовой концепции Student

public interface Student {
    public int getID();
    public String getSSN();
    public String getName();
    public String getAddress();
    public String getPhoneNumber();
}

Затем мы можем разработать TableModel, которыйможет использоваться для его поддержки ...

public class StudentTableModel extends AbstractTableModel {

    protected static final String COLUMN_NAMES[] = {
        "ID", "Number", "Name", "Address", "Phone Number"
    };

    private List<Student> students;

    public StudentTableModel(List<Student> students) {
        // Prevent possible external mutation
        this.students = new ArrayList<>(students);
    }

    @Override
    public int getRowCount() {
        return students.size();
    }

    @Override
    public int getColumnCount() {
        return COLUMN_NAMES.length;
    }

    @Override
    public String getColumnName(int column) {
        return COLUMN_NAMES[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0: return Integer.class;
            default: return String.class;
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Student student = students.get(rowIndex);
        switch (columnIndex) {
            case 0: return student.getID();
            case 1: return student.getSSN();
            case 2: return student.getName();
            case 3: return student.getAddress();
            case 4: return student.getPhoneNumber();
        }
    }

}

Это не изменяемая модель, я оставлю вас, чтобы выяснить, как добавить изменяемые функции.

Итак, в вашемвид, вы бы использовали контроллер, чтобы получить один или несколько Student s ...

Student student = controller.getOneSpecificStudent(1);

Затем вы бы создали модель для студента ...

List<Student> students = new ArrayList<>();
students.add(student);
TableModel model = StudentTableModel(students);

А затем примените его к вашему мнению ...

someInstanceOfJTable.setModel(model);

Сейчас.При необходимости контроллер может вернуть StudentTableModel, но я лично считаю, что это выходит за рамки контроллера, поскольку он не должен диктовать условия отображения представлению, это не его ответственность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...