Как вы заставляете String принимать возвращаемое значение из метода? - PullRequest
0 голосов
/ 13 марта 2020

Моя программа выглядит следующим образом: когда я нажимаю кнопку, в этом всплывающем окне появляется всплывающее окно (другой класс JFrame, я не использовал JOptionPane), есть JTable, который содержит данные из базы данных (которые являются именами файлов) ) Я хочу взять это имя файла и использовать его в другом классе для использования другой функции.

Здесь я объявил строку в классе "OpenLesson" (это всплывающее окно):

public class openLesson extends javax.swing.JFrame {

    String activeLesson = "Manually Added"; //this is default when nothing is selected

    public openLesson() {
        initComponents();
    }

и затем здесь функция getLesson (), которая берет данные из базы данных в зависимости от того, что выбрано в JTable. А также измените значение строки activeLesson в зависимости от того, что выбрано:

public String getLesson() throws ClassNotFoundException, SQLException {

    int selectedColumn = 0;
    int selectedRow = tblOpenLesson.getSelectedRow(); // this is the JTable
    Connection con = null;
    Statement stmtGetLesson = null;
    try {
        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:sql_items.sqlite");
        stmtGetLesson = con.createStatement();
        ResultSet rs = stmtGetLesson.executeQuery("SELECT * FROM lessons WHERE lesson = '" + tblOpenLesson.getModel().getValueAt(selectedRow, selectedColumn) + "';");

        if (rs.next()) {
            activeLesson = rs.getString("lesson"); // this (should) change the value of activeLesson above with the result of the query
            return rs.getString("lesson");
        }
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, e);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(openLesson.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        con.close();
        stmtGetLesson.close();
    }
    return "";
}

Теперь для другого класса , я хочу использовать строку activeLesson, потому что я хочу использовать его в запросе sqlite для другого JTable. Вот функция:

public void exeUpdateDBquestion_items(String ans, String desc) throws ClassNotFoundException, SQLException{
    openLesson ol = new openLesson();

    Connection con = null;
    Statement stmt = null;
    try {
        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:sql_items.sqlite"); // connect to database
        stmt = con.createStatement();
        stmt.executeUpdate("INSERT INTO question_items (item_name, item_desc, lesson) VALUES ('" + ans + "','" + desc + "','" + ol.activeLesson + "')");
        JOptionPane.showMessageDialog(null, "Identified Item Saved!");
    } catch (SQLException e){
        JOptionPane.showMessageDialog(null, e.getMessage());
    } finally {
        con.close();
        stmt.close();
    }
}

И здесь возникает проблема, независимо от того, что я выбираю на JTable из класса openLesson, activeLesson по-прежнему использует текст по умолчанию «Вручную добавленный», а не выбранные данные.

Извините, если это глупый вопрос, я новичок в java и в программировании в целом, поэтому я не совсем понимаю, в чем здесь проблема.

РЕДАКТИРОВАТЬ: Вот как моя таблица получает свои данные. При нажатии этой кнопки появится всплывающее окно с таблицей (у меня есть функция, которая обновляет базу данных перед этой функцией).

public void updateDBlessons() throws SQLException {
    Connection con = null;
    Statement stmt = null;
    try {
        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:sql_items.sqlite");
        stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM lessons");
        DefaultTableModel dtm = (DefaultTableModel) tblOpenLesson.getModel();
        dtm.setRowCount(0);

        while(rs.next()){
            Object o[] = {rs.getString("lesson")};
            dtm.addRow(o);
        }
    } catch (ClassNotFoundException | SQLException e) {
        System.out.println(e);
    } finally {
        con.close();
        stmt.close();
    }
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Я действительно не знаю, как я это сделал, но после 13 часов экспериментов это сработало для меня.

Я заставил функцию exeUpdateDBquestion_items принять 3 параметра (теперь это будет включать lesson) вместо явного помещения его в запрос:

public void exeUpdateDBquestion_items(String ans, String desc, String lesson) throws ClassNotFoundException, SQLException{

    Connection con = null;
    Statement stmt = null;
    try {
        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:sql_items.sqlite"); // connect to database
        stmt = con.createStatement();
        stmt.executeUpdate("INSERT INTO question_items (item_name, item_desc, lesson) VALUES ('" + ans + "','" + desc + "','" + lesson + "')");
        JOptionPane.showMessageDialog(null, "Identified Item Saved!");
        System.out.println(ol.activeLesson + " lesson updated too");
    } catch (SQLException e){
        JOptionPane.showMessageDialog(null, e.getMessage());
    } finally {
        con.close();
        stmt.close();
    }
}

и в кнопке, которая активирует эту функцию, я вызвал метод getLesson() вместо строковой переменной activeLesson:

private void btnSaveIdentifiedActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    btnIdentifyAnswer.setVisible(true);
    btnIdentifyDesc.setVisible(false);
    btnSaveIdentified.setVisible(false);
    openLesson ol = new openLesson(); // this is the other class

    try {
        if (checkIfExists() == true){
            JOptionPane.showMessageDialog(null, "Item Already Exists.");
        } else {
        exeUpdateDBquestion_items(ansTempHandler, descTempHandler, ol.getLesson()); // called the method here instead of the variable
        }
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(mainScreen.class.getName()).log(Level.SEVERE, null, ex);
    }
}   

и это решило проблему. Спасибо, ребята, за все подсказки.

0 голосов
/ 13 марта 2020

Учитывая, что вы создаете новый объект в своей функции exeUpdateDBquestion_items () , вам нужно вызвать функцию getLesson () , если вы хотите изменить значение атрибута activeLesson внутри другой класс.

public void exeUpdateDBquestion_items(String ans, String desc) throws ClassNotFoundException, SQLException{
openLesson ol = new openLesson();
ol.getLesson();

Или

public openLesson() {
    initComponents();
    this.getLesson();
}

И вы можете ограничить доступ к своему атрибуту и ​​добавить метод получения / установки:

private String activeLesson

public getActiveLesson();
public setActiveLesson();
...