Набор результатов Java и AbstractTableModel для обновления JTable

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

вот весь код:

view.CatalogueSWING.java

public class CatalogueSWING extends JFrame{


 JLabel jLabelMC = new JLabel("Key Word"); 
 JTextField jTextFieldMC = new JTextField(20); // The textfield that contains the search keyword
 JButton jButtonSearch = new JButton("Search");
 CatalogueBusiness ca; // the business class which contains the "SearchByKeyWord method"
 JTable table;
 JPanel pCenter;
 //---

 public CatalogueSWING() {
     ca = new CatalogueBusiness();

     JPanel pNorth = new JPanel();
     pNorth.setLayout(new FlowLayout());

     pNorth.add(jLabelMC);
     pNorth.add(jTextFieldMC);
     pNorth.add(jButtonSearch);

     pCenter = new JPanel();
     pCenter.setLayout(new BorderLayout());

     pCenter.add(table);

     this.setLayout(new BorderLayout());
     this.add(pCenter, BorderLayout.CENTER);
     this.setSize(900, 500);
     pCenter.add(new JScrollPane(table));
     this.add(pNorth, BorderLayout.NORTH);

     this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     this.setVisible(true);

     jButtonSearch.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                String kw = jTextFieldMC.getText();
                table = new JTable(ca.SearchByKeyWord(kw)); // SearchByKeyWord(String kw) is the method in my CatalogueBusiness class in another package.
                pCenter.add(table);

                System.out.println("You clicked the button");
            }
        });  
 }

Вот бизнес-класс:

business.CatalogueBusiness.java :

@Override
    public List<Product> SearchByKeyWord(String kw) {
        List<Product> listProducts = new ArrayList<Product>();

    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DB_TPJDBC","root","password");

        PreparedStatement ps = conn.prepareStatement("select * from PRODUCTS where NAME_PROD like ?");
        ps.setString(1, "%"+kw+"%");
        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            Productp = new Produit();
            p.setIdProduct(rs.getInt("ID_PROD"));
            p.setNomProduct(rs.getString("NAME_PROD"));
            p.setPrice(rs.getDouble("PRICE"));
            p.setQuantite(rs.getInt("QUANTITY"));

            listProducts.add(p);    
        } 

        //ps.close();
        //conn.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return listProducts;
}

и вот класс продукта:

бизнес.Продукт.java :

import java.io.Serializable;

public class Product implements Serializable {

    private int idProduct;
    private String nomProduct;
    private double price;
    private int quantity;


    public Produit(String nomProduct, double price, int quantity) {
        super();
        this.nomProduct = nomProduct;
        this.price = price;
        this.quantity = quantity;
    }
    public Product() {
        super();
    }
    // getters & setter ...
    // ...

и, наконец, AbsractTableModel

бизнес.ProductModel.java

public class ProduitModel extends AbstractTableModel{

    @Override
    public int getColumnCount() {
    //....
}
@Override
public int getRowCount() {
    //...
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    //...
}
@Override
public String getColumnName(int column) {
//...
}

Я остановился здесь, я не знаю, как использовать AbstractTableModel в моем случае, я много искал и до сих пор не знаю, как использовать его с моим набором результатов, чтобы обновлять JTable каждый раз, когда я нажимаю «Кнопку поиска» с некоторым ключевым словом. в текстовом поле поиска.

Заранее спасибо.


person dwix    schedule 08.07.2015    source источник


Ответы (1)


Начните с просмотра Как использовать таблицы для получения дополнительной информации. .

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

  • getRowCount, сообщает таблице, сколько строк она должна отображать
  • getColumnCount сообщает таблице, сколько столбцов она должна отображать
  • getColumnName сообщает таблице, какое имя имеет конкретный столбец, это отображается в заголовке таблицы
  • getColumnClass используется таблицей для принятия решения о том, какой модуль визуализации/редактора ячеек следует использовать в случае, если для столбца не указан пользовательский модуль визуализации.
  • getValueAt, возвращает значение для данной ячейки (строка/столбец)
  • setValueAt, запрашивает, чтобы модель обновила значение для данной ячейки
  • isCellEditable определяет, можно ли редактировать данную ячейку или нет

Итак, вооружившись этой базовой информацией, мы можем сгенерировать простую TableModel, которая обертывает List из Products, например...

public static class ProductTableModel extends AbstractTableModel {

    protected static final String[] COLUMN_NAMES = {"id", "Name", "Price", "Quantity"};
    protected static final Class[] COLUMN_TYPES = {Integer.class, String.class, Double.class, Integer.class};
    private List<Product> products;

    public ProductTableModel(List<Product> products) {
        this.products = new ArrayList<>(products);
    }

    @Override
    public int getRowCount() {
        return products.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) {
        return COLUMN_TYPES[columnIndex];
    }

    protected Product getProductForRow(int row) {
        return products.get(row);
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Product product = getProductForRow(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = product.getIdProduct();
                break;
            case 1:
                value = product.getNomProduct();
                break;
            case 2:
                value = product.getPrice();
                break;
            case 3:
                value = product.getQuantity();
                break;
        }
        return value;
    }

}

Теперь это довольно простой, нередактируемый пример.

Чтобы использовать его, вы просто создадите новый ProductTableModel с результатами вашего метода SearchByKeyWord и примените его к уже существующему JTable...

jButtonSearch.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        String kw = jTextFieldMC.getText();
        table.setModel(new ProductTableModel(ca.SearchByKeyWord(kw)));
    }
});  

Табличный API, вероятно, является третьим по сложности API в библиотеке Swing (с базовым текстовым компонентом и JTree API более сложным), но его запрет — одна из самых распространенных вещей, которые вы будете делать. Если вы можете разобраться в этом, вы найдете остальную часть API относительно простой (включая понимание дерева API;))

person MadProgrammer    schedule 08.07.2015
comment
Большое вам спасибо, это работает, и теперь я понимаю это лучше, я действительно очень ценю вашу помощь, вы спасли меня! - person dwix; 08.07.2015