Кнопка / флажок условно в JTable - PullRequest
0 голосов
/ 16 апреля 2020

Я делаю библиотечную систему для школьного проекта. В моей функции поиска у меня есть запрос SQL, который выводится в набор результатов, который затем используется для создания DefaultTableModel, которая, в свою очередь, используется для обновления таблицы и отображения результатов поиска.

Код для этого поиска ниже:

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;

public class Search 
{
    private final String searchTerm, fileDir, table, defOrder;
    private String condition;
    private final String [] bookColumnNames;
    private final boolean showLoaned, showDistinct;

    public Search(String term, String dir, String tbl, String order, boolean showLoan, boolean distinct)
    {
        this.bookColumnNames = new String[]{"Title", "Author", "Genre", "ISBN", "Checkout"};
        searchTerm = term;
        fileDir = dir;
        table = tbl;
        showLoaned = showLoan;
        showDistinct = !distinct;
        defOrder = order;
    }

    DefaultTableModel searchBooks()
    {
        DefaultTableModel res = new DefaultTableModel();

        for (String columnName : bookColumnNames) 
        {
            res.addColumn(columnName);
        }

        if(isISBN(searchTerm))condition = "ISBN LIKE '" + searchTerm + "*'";
        else if(showLoaned)condition = "Title LIKE '" + searchTerm + "*' OR Author LIKE '" + searchTerm + "*' OR Genre LIKE '" + searchTerm + "*'";
        else condition = "(Title LIKE '" + searchTerm + "*' OR Author LIKE '" + searchTerm + "*' OR Genre LIKE '" + searchTerm + "*') AND Loaned = No";

        String defaultQuery;
        if(showDistinct) defaultQuery = "SELECT DISTINCT Title, Author, Genre, ISBN from " + table + " WHERE " + condition + " " + defOrder + ";";
        else defaultQuery = "SELECT Title, Author, Genre, ISBN from " + table + " WHERE " + condition + " " + defOrder + ";";

        ResultSet resSet = search(defaultQuery);

        int columns = 4;

        try
        {
            while (resSet.next()) 
            {
                Object[] row = new Object[columns];
                for (int i = 1; i <= columns; i++)
                {  
                    row[i - 1] = resSet.getObject(i);
                }

                res.insertRow(resSet.getRow()-1,row);
            }
        }
        catch(SQLException e)
        {
        }

        return res;
    }

    ResultSet search(String defQuery)
    {
        ResultSet res = null;
        try
        {
            Connection connection = DriverManager.getConnection("jdbc:ucanaccess://" + fileDir);
            PreparedStatement prepState = connection.prepareStatement(defQuery);
            res = prepState.executeQuery();
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        return res;
    }

    private boolean isISBN(String term)
    {
        boolean check = true;

        if(term.length() == 13)
        {
            for(int i = 1; i <= term.length(); i++)
            {
                if(!Character.isDigit(term.charAt(i - 1)))
                {
                    check = false;
                    break;
                }
            }
        }
        else
        {
            check = false;
        }

        return check;
    }

Код для обновления таблицы находится здесь:

private void searchBarButtonActionPerformed(java.awt.event.ActionEvent evt) 
{                                                
        search = new Search(searchBar.getText(), config.get("databaseFileDirectory"),"tblBooks", config.get("defaultBookSort"), showLoaned.isSelected(), showDistinct.isSelected());
        DefaultTableModel model = search.searchBooks();
        searchResults.setModel(model);

        numSearchResults.setText(model.getRowCount() + " result(s) found");
}

Есть ли способ разместить кнопку / флажок в последнем столбце таблицы в зависимости от того, одолжена книга или нет? Если так, как бы я сделал эту функцию кнопки таким образом, чтобы я мог добавить эту указанную запись таблицы c в массив двумерных объектов или список для создания корзины? Эту кнопку / флажок следует поместить в столбец «Оформить заказ».

Я приношу свои извинения, если мой метод неэффективен / плохо продуман. Я только около 1,5 лет в Java dev, и это мой первый крупный проект. Будем весьма благодарны за любые предложения с точки зрения решений logi c или реального кода.

1 Ответ

0 голосов
/ 25 апреля 2020

Я создаю библиотечную систему для школьного проекта.

При работе с большим приложением Java, один из способов упростить кодирование - использовать модель / просмотр / контроллер шаблон. Разделяя задачи, вы можете сосредоточиться на одной части приложения за раз.

Хорошо, я собираюсь сделать некоторые предположения. Давайте предположим, что в библиотеке есть книги.

Итак, давайте создадим класс для хранения книги. Этот класс является простым Java классом. Это не имеет никакого отношения к Swing или любому виду GUI. Это совершенно независимо. Мы называем это классом модели.

Этот класс является частью модели приложения. Будут другие классы для описания других аспектов библиотеки,

import java.util.ArrayList;
import java.util.List;

public class Book {

    private final String title;
    private final String isbn;

    private List<String> author;
    private List<String> genre;

    public Book(String title, String isbn) {
        this.title = title;
        this.isbn = isbn;
        this.author = new ArrayList<>();
        this.genre = new ArrayList<>();
    }

    public String getTitle() {
        return title;
    }

    public void addAuthor(String author) {
        this.author.add(author);
    }

    public List<String> getAuthor() {
        return author;
    }

    public String getIsbn() {
        return isbn;
    }

    public void addGenre(String genre) {
        this.genre.add(genre);
    }

    public List<String> getGenre() {
        return genre;
    }

}

В Java имена классов - TitleCase. Имена методов и имена полей являются camelCase.

Все в классе Book связано с книгой. Чтобы получить коллекцию книг, мы создадим List<Book> в другом классе моделей.

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

Книга имеет одного или нескольких авторов.

Книга имеет один код ISBN.

Книга может быть помещена в один или больше жанров.

Теперь нам все еще нужно моделировать посетителей. Это было бы логически Patron классом.

import java.util.ArrayList;
import java.util.List;

public class Patron {

    private String name;
    private String address;
    private String phoneNumber;

    private List<Book> checkedOut;

    public Patron(String name, String address, String phoneNumber) {
        this.name = name;
        this.address = address;
        this.phoneNumber = phoneNumber;
        this.checkedOut = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public List<Book> getCheckedOut() {
        return checkedOut;
    }

    public void addCheckedOut(Book checkedOut) {
        this.checkedOut.add(checkedOut);
    }

    public void removeCheckedOut(Book returned) {
        this.checkedOut.remove(returned);
    }
}

Я думаю, вы поняли модель приложения.

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

Во-вторых, из модели приложения создайте свой SQL таблицы. Создайте класс SQL, который содержит весь код SQL. Я не видел достаточно вашего кода, чтобы создать для вас класс SQL.

В-третьих, создайте Swing GUI. Вы можете использовать модели Swing по умолчанию для этого шага.

Вот один из моих SQL классов, чтобы дать вам представление о том, как вы должны кодировать свой SQL класс. Я использую MySQL. Вы всегда должны использовать подготовленные операторы для предотвращения SQL инъекционных атак .

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import com.amazon.ask.model.User;
import com.ggl.bible.reader.model.Book;
import com.ggl.bible.reader.model.Verse;
import com.ggl.bible.reader.model.VerseKey;

public class SQL {

    private Connection connection;

    public boolean connect() {
        try {
            String[] params = createConnectionStrings();
            connection = DriverManager.getConnection(params[0], 
                    params[1], params[2]);
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    private String[] createConnectionStrings() {
        String[] connection = new String[3];
        String host = "bible-database.caaitaoyrsgp.us-east-1."
                + "rds.amazonaws.com";
        String port = "3306";
        String user = "ggleblanc";
        String useSSL = "?useSSL=false";
        String schema = "/bible";
        String password = "******************";
        String driver = "jdbc:mysql://" + host + ":" + port;
        driver += schema + useSSL;
        connection[0] = driver;
        connection[1] = user;
        connection[2] = password;
        return connection;
    }

    public void close() {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public Optional<Timestamp> selectLastCreated() {
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT `timestamp` ");
        builder.append("    FROM `bible`.`lastCreated` ");
        builder.append("    ORDER BY `timestamp` DESC ");
        builder.append("    LIMIT 0, 1; ");
        String sql = builder.toString();

        try {
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery(sql);
            rs.next();
            Optional<Timestamp> timestamp = Optional.of(
                    rs.getTimestamp(1));
            rs.close();
            return timestamp;
        } catch (SQLException e) {
            e.printStackTrace();
            return Optional.empty();
        }

    }

    public List<Book> selectBooks() {
        List<Book> books = new ArrayList<>();
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT `bookId`, `bookShortName`, ");
        builder.append("    `bookName` ");
        builder.append("    FROM `bible`.`book`; ");
        String sql = builder.toString();

        try {
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery(sql);
            while (rs.next()) {
                int bookID = rs.getInt("bookID");
                String bookShortName = rs.getString(
                        "bookShortName");
                String bookName = rs.getString("bookName");
                Book book = new Book(bookID, bookShortName, 
                        bookName);
                books.add(book);
            }
            rs.close();
            return books;
        } catch (SQLException e) {
            e.printStackTrace();
            return new ArrayList<Book>();
        }
    }

    public int selectLastChapter(int bookID) {
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT MAX(`chapter`) ");
        builder.append("    FROM `bible`.`verse` ");
        builder.append("    WHERE `bookID` = ? ");
        String sql = builder.toString();

        try {
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setInt(1, bookID);
            ResultSet rs = statement.executeQuery();
            rs.next();
            int result = rs.getInt(1);
            rs.close();
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }

    public int selectLastVerse(int bookID, int chapter) {
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT MAX(`verse`) ");
        builder.append("    FROM `bible`.`verse` ");
        builder.append("    WHERE `bookID` = ? ");
        builder.append("    AND `chapter` = ? "); 
        String sql = builder.toString();

        try {
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setInt(1, bookID);
            statement.setInt(2, chapter);
            ResultSet rs = statement.executeQuery();
            rs.next();
            int result = rs.getInt(1);
            rs.close();
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }

    public List<Verse> selectPassage(VerseKey startVerseKey, 
            VerseKey endVerseKey) {
        List<Verse> verses = new ArrayList<>();
        String[] sql = new String[2];

        StringBuilder builder = new StringBuilder();
        builder.append("SELECT `verseID` ");
        builder.append("    FROM `bible`.`verse` ");
        builder.append("    WHERE `bookID` = ? ");
        builder.append("    AND `chapter` = ? "); 
        builder.append("    AND `verse` = ?; ");
        sql[0] = builder.toString();

        builder = new StringBuilder();
        builder.append("SELECT `bookID`, `chapter`, `verse`, "
                + "`text` ");
        builder.append("    FROM `bible`.`verse` "); 
        builder.append("    WHERE `verseID` BETWEEN ? AND ? "); 
        sql[1] = builder.toString();

        try {
            PreparedStatement statement = 
                    connection.prepareStatement(sql[0]);
            statement.setInt(1, startVerseKey.getBookID());
            statement.setInt(2, startVerseKey.getChapter());
            statement.setInt(3, startVerseKey.getVerse());
            ResultSet rs = statement.executeQuery();
            if (!rs.next()) {
                rs.close();
                return verses;
            }
            int startIndex = rs.getInt("verseID");
            rs.close();

            statement.setInt(1, endVerseKey.getBookID());
            statement.setInt(2, endVerseKey.getChapter());
            statement.setInt(3, endVerseKey.getVerse());
            rs = statement.executeQuery();
            if (!rs.next()) {
                rs.close();
                return verses;
            }
            int endIndex = rs.getInt("verseID");
            rs.close();

            statement = connection.prepareStatement(sql[1]);
            statement.setInt(1, startIndex);
            statement.setInt(2, endIndex);
            rs = statement.executeQuery();
            while (rs.next()) {
                int bookID = rs.getInt("bookID");
                int chapter = rs.getInt("chapter");
                int verseNum = rs.getInt("verse");
                String text = rs.getString("text");
                Verse verse = new Verse(bookID, chapter, 
                        verseNum, text);
                verses.add(verse);
            }
            rs.close();
            return verses;
        } catch (SQLException e) {
            e.printStackTrace();
            return new ArrayList<Verse>();
        }
    }

    public Optional<Verse> selectNextVerse(VerseKey verseKey) {
        String[] sql = new String[2];

        StringBuilder builder = new StringBuilder();
        builder.append("SELECT `verseID` ");
        builder.append("    FROM `bible`.`verse` ");
        builder.append("    WHERE `bookID` = ? ");
        builder.append("    AND `chapter` = ? "); 
        builder.append("    AND `verse` = ?; ");
        sql[0] = builder.toString();

        builder = new StringBuilder();
        builder.append("SELECT `bookID`, `chapter`, "
                + "`verse`, `text` ");
        builder.append("    FROM `bible`.`verse` "); 
        builder.append("    WHERE `verseID` = ? "); 
        sql[1] = builder.toString();

        try {
            PreparedStatement statement = 
                    connection.prepareStatement(sql[0]);
            statement.setInt(1, verseKey.getBookID());
            statement.setInt(2, verseKey.getChapter());
            statement.setInt(3, verseKey.getVerse());
            ResultSet rs = statement.executeQuery();
            if (!rs.next()) {
                rs.close();
                return Optional.empty();
            }
            int verseID = rs.getInt("verseID");
            rs.close();

            statement = connection.prepareStatement(sql[1]);
            statement.setInt(1, verseID + 1);
            rs = statement.executeQuery();
            if (!rs.next()) {
                rs.close();
                return Optional.empty();
            }
            int bookID = rs.getInt("bookID");
            int chapter = rs.getInt("chapter");
            int verseNum = rs.getInt("verse");
            String text = rs.getString("text");
            Verse verse = new Verse(bookID, chapter, 
                    verseNum, text);
            rs.close();
            return Optional.of(verse);
        } catch (SQLException e) {
            e.printStackTrace();
            return Optional.empty();
        }
    }

    public int selectVisitCount(User user) {
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT `numberOfVisits` ");
        builder.append("    FROM `bible`.`archive` "); 
        builder.append("    WHERE `userID` = ?; ");
        String sql = builder.toString();
        String userID = user.getUserId();

        try {
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setString(1, userID);
            ResultSet rs = statement.executeQuery();
            if (!rs.next()) {
                rs.close();
                return -1;
            }
            int result = rs.getInt(1);
            rs.close();
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }

    public int[] selectPassageChapter(User user) {
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT `passageBookID`, "
                + "`passageChapter`, ");
        builder.append("       `passageVerse` ");
        builder.append("    FROM `bible`.`archive` "); 
        builder.append("    WHERE `userID` = ?; ");
        String sql = builder.toString();
        String userID = user.getUserId();

        try {
            int[] output = {-1, -1, -1};
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setString(1, userID);
            ResultSet rs = statement.executeQuery();
            if (!rs.next()) {
                rs.close();
                return output;
            }
            output[0] = rs.getInt("passageBookID");
            output[1] = rs.getInt("passageChapter");
            output[2] = rs.getInt("passageVerse");
            rs.close();
            return output;
        } catch (SQLException e) {
            e.printStackTrace();
            int[] output = {-1, -1, -1};
            return output;
        }
    }

    public int[] selectReadingChapter(User user) {
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT `readingBookID`, "
                + "`readingChapter`, ");
        builder.append("       `readingStartVerse`, "
                + "`readingEndVerse` ");
        builder.append("    FROM `bible`.`archive` "); 
        builder.append("    WHERE `userID` = ?; ");
        String sql = builder.toString();
        String userID = user.getUserId();

        try {
            int[] output = {-1, -1, -1, -1};
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setString(1, userID);
            ResultSet rs = statement.executeQuery();
            if (!rs.next()) {
                rs.close();
                return output;
            }
            output[0] = rs.getInt("readingBookID");
            output[1] = rs.getInt("readingChapter");
            output[2] = rs.getInt("readingStartVerse");
            output[3] = rs.getInt("readingEndVerse");
            rs.close();
            return output;
        } catch (SQLException e) {
            e.printStackTrace();
            int[] output = {-1, -1, -1, -1};
            return output;
        }
    }

    public void insertArchiveRow(User user) {
        StringBuilder builder = new StringBuilder();
        builder.append("INSERT INTO `bible`.`archive` "); 
        builder.append("    (`archiveID`, `numberOfVisits`, "); 
        builder.append("    `readingBookID`, `readingChapter`, "); 
        builder.append("    `readingStartVerse`, "
                + "`readingEndVerse`, ");
        builder.append("    `passageBookID`, "); 
        builder.append("    `passageChapter`, `passageVerse`, "); 
        builder.append("    `lastVisitTimeStamp`, `userID`) "); 
        builder.append("VALUES (DEFAULT, ?, ?, ?, "
                + "?, ?, ?, ?, ?, ");
        builder.append("    CURRENT_TIMESTAMP, ?); "); 
        String sql = builder.toString();
        String userID = user.getUserId();

        try {
            connection.setAutoCommit(false);
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setInt(1, 1);
            statement.setInt(2, 0);
            statement.setInt(3, 0);
            statement.setInt(4, 0);
            statement.setInt(5, 0);
            statement.setInt(6, 0);
            statement.setInt(7, 0);
            statement.setInt(8, 0);
            statement.setString(9, userID);
            statement.executeUpdate();
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void updateVisitCount(User user) {
        StringBuilder builder = new StringBuilder();
        builder.append("UPDATE `bible`.`archive` ");  
        builder.append("SET `numberOfVisits` = "
                + "`numberOfVisits` + 1, ");
        builder.append("    `lastVisitTimestamp` = "
                + "CURRENT_TIMESTAMP ");
        builder.append("WHERE `userID` = ? "); 
        String sql = builder.toString();
        String userID = user.getUserId();

        try {
            connection.setAutoCommit(false);
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setString(1, userID);
            statement.executeUpdate();
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }   

    public void updatePassageChapter(User user, 
            VerseKey verseKey) {
        StringBuilder builder = new StringBuilder();
        builder.append("UPDATE `bible`.`archive` ");  
        builder.append("SET `passageBookID` = ?, "); 
        builder.append("    `passageChapter` = ?, "); 
        builder.append("    `passageVerse` = ? "); 
        builder.append("WHERE `userID` = ? "); 
        String sql = builder.toString();
        String userID = user.getUserId();

        try {
            connection.setAutoCommit(false);
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setInt(1, verseKey.getBookID());
            statement.setInt(2, verseKey.getChapter());
            statement.setInt(3, verseKey.getVerse());
            statement.setString(4, userID);
            statement.executeUpdate();
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void updateReadingChapter(User user, 
            VerseKey verseKey, int endVerse) {
        StringBuilder builder = new StringBuilder();
        builder.append("UPDATE `bible`.`archive` ");  
        builder.append("SET `readingBookID` = ?, "); 
        builder.append("    `readingChapter` = ?, "); 
        builder.append("    `readingStartVerse` = ?, "); 
        builder.append("    `readingEndVerse` = ? "); 
        builder.append("WHERE `userID` = ? "); 
        String sql = builder.toString();
        String userID = user.getUserId();

        try {
            connection.setAutoCommit(false);
            PreparedStatement statement = 
                    connection.prepareStatement(sql);
            statement.setInt(1, verseKey.getBookID());
            statement.setInt(2, verseKey.getChapter());
            statement.setInt(3, verseKey.getVerse());
            statement.setInt(4, endVerse);
            statement.setString(5, userID);
            statement.executeUpdate();
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}
...