Sorting & Filtering JTable connected to SQL database

0

Hej,

Czy możliwe jest sortowanie rekordów bazy danych wyświetlanych w JTable poprzez standardowe podwójne kliknięcie na kolumnie tabeli?

Mam taką sytuację, że w JTable wizualizuję bazę danych i przy korzystaniu ze standardowego RowSorter'a dane JUŻ wyświetlone faktycznie są sortowane, ale np. przy chęci wydrukowania zaznaczonych wierszy już po przesortowaniu, drukuje mi te wiersze, które znajdywały się w wybranych miejscach przed sortowaniem.

Wychodzi na to, że muszę połączyć sortowanie według np. kolumn z odświeżaniem bazy danych np. wykorzystując ORDER BY, ale jak do tego podejść? Chciałbym was prosić o jakieś wskazówki. Będę bardzo wdzięczny.

Mógłbym oczywiście walnąć JComboBox z wyborem kolumny, którą chcę sortować, ale to takie "brudne" i nieeleganckie rozwiązanie ;/

Pozdrawiam ciepło! :)

0

A jak drukujesz? Skorzystaj może z metody convertRowIndexToModel.

0

Hej, korzystam z tego:

JButton btnPrintDatabase = new JButton("Print database");
btnPrintDatabase.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent arg0) 
    {
        //IMP: PrintDatabaseButton
        MessageFormat header = new MessageFormat("Informations about users from 'admindatabase'");
        MessageFormat footer = new MessageFormat("Page{0, number, integer}");
            

        /**
         * Całe ciało "if" umożliwia mi drukowanie tylko zaznaczonych wierszy, 
         * ale nie działa, gdy posortuję tabelkę standardowym sorterem (kliknięcie kolumny).
         * Wtedy drukuje mi (tak jak to opisałem wcześniej) wiersze, które "już tam były".
         */
        if (table.getSelectedRowCount() != 0)
        {
            try
            {
                String sql = "SELECT * FROM admindatabase";

                ps = conn.prepareStatement(sql);
                rs = ps.executeQuery();
                ResultSetMetaData rsmetadata = rs.getMetaData();

                int columns = rsmetadata.getColumnCount();

                DefaultTableModel dtm = new DefaultTableModel();

                Vector columns_name = new Vector();

                for (int i = 1; i <= columns; i++)
                {
                    columns_name.addElement(rsmetadata.getColumnName(i));
                }
                dtm.setColumnIdentifiers(columns_name);

                int selectedRows[] = table.getSelectedRows();

                for (int i = 0; i < selectedRows.length; i++)
                {
                    String tableSelectedRow = (table.getModel().getValueAt(selectedRows[i], 0).toString());
                    String sqlRows = "SELECT * FROM admindatabase WHERE UserID='"+tableSelectedRow+"'";

                    Vector data_rows = new Vector();
                    ps = conn.prepareStatement(sqlRows);
                    rs = ps.executeQuery();

                    if (rs.next())
                    {
                        for (int j = 1; j <= columns; j++)
                        {
                            data_rows.addElement(rs.getString(j));
                        }
                        dtm.addRow(data_rows);
                    }
                }
                table.setModel(dtm);
            }
            catch (Exception e)
            {
                JOptionPane.showMessageDialog(null, e);
            }
        }
  
        // A to już sam blok do drukowania.
        try
        {
            table.print(JTable.PrintMode.NORMAL, header, footer);
        }
        catch (java.awt.print.PrinterException e)
        {
            System.err.format("Cannot print %s&n", e.getMessage());
        }
    }
});

Ps zaraz ogarnę tą metodę co zapodałeś. Zobaczymy co z tego wyjdzie :)

Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1