Pytanie Jak zapewnić obsługę stronicowania dla JTable w Swing?


Stworzyłem jeden GUI w Swing Java, w którym użyłem JTable. Teraz chcę wyświetlić informacje na następnej stronie, używając paginacji. Jak mam to zrobić?


12
2017-09-26 12:45


pochodzenie




Odpowiedzi:


Paging w Swing JTable wygląda jak fajny artykuł.

Oto fragment:

O ile dobrze pamiętam, rozwiązanie tego problemu leży w koncepcji stronicowania: wystarczy pobrać dane, które użytkownik chce zobaczyć, i nic więcej. Oznacza to również, że czasami trzeba pobierać dodatkowe dane z serwera bazy danych (lub serwera aplikacji), jeśli użytkownik przewinie listę.

Duże było moje zdziwienie, że tak naprawdę nie było to gotowe rozwiązanie (nawet rozwiązanie typu "kopiuj i wklej"). Każdy, kto zna jedną, proszę nie wahaj się rozszerzyć moją (raczej ograniczoną) wiedzę na temat platformy J2EE.

Więc wkopaliśmy się i próbowaliśmy sami zbudować rozwiązanie.   Ostatecznie zaproponowaliśmy dostosowaną klasę TableModel, która zajmuje się przywoływaniem.


3
2017-09-26 13:24



Podziękuj Petros za sugestię - om.


Inną opcją do zaimplementowania tego jest użycie przewijania bez pasków przewijania i przycisków nawigacji pary w celu uzyskania kontroli. Dodane przyciski są normalne JButtons dla prototypu.

Poniżej znajduje się szybki prototyp. Tworzy kilka założeń, z których jednym jest to, że model tabeli ma wszystkie swoje dane. Można wykonać prace, aby zapewnić, że wiersze kończą się w górnej części widoku podczas nawigacji.

private void buildFrame() {
    frame = new JFrame("Demo");
    frame.setSize(300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addStuffToFrame();
    frame.setVisible(true);

}

private void addStuffToFrame() {
    final JTable table = getTable();
    final JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
    final JButton next = new JButton("next");
    final JButton prev = new JButton("prev");

    ActionListener al = new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            Rectangle rect = scrollPane.getVisibleRect();
            JScrollBar  bar = scrollPane.getVerticalScrollBar();
            int blockIncr = scrollPane.getViewport().getViewRect().height;
            if (e.getSource() == next) {
                bar.setValue(bar.getValue() + blockIncr);
            } else if (e.getSource() == prev) {
                bar.setValue(bar.getValue() - blockIncr);
            }
            scrollPane.scrollRectToVisible(rect);
        }
    };

    next.addActionListener(al);
    prev.addActionListener(al);

    JPanel panel = new JPanel(new BorderLayout());
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(prev);
    buttonPanel.add(next);
    panel.add(buttonPanel, BorderLayout.NORTH);
    panel.add(scrollPane, BorderLayout.CENTER);
    frame.getContentPane().add(panel);
}

private JTable getTable() {
    String[] colNames = new String[]{
            "col 0", "col 1", "col 2", "col 3"
    };

    String[][] data = new String[100][4];
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 4; j++) {
            data[i][j] = "r:" + i + " c:" + j;
        }
    }

    return new JTable(data,colNames);

}

alt tekst http://img7.imageshack.us/img7/4205/picture4qv.png


3
2017-09-26 15:37





Możesz spróbować z 2 zapytaniami, pierwsze zapytanie to zliczenie wszystkich wierszy w DB, a drugie zapytanie dla real dane :) A po stronie interfejsu możesz spróbować tak:


public class MainForm extends javax.swing.JFrame {
   private void initDefaultValue() {
        rowsPerPage = Integer.valueOf(cmbPageSize.getSelectedItem().toString());
        totalRows = Main.getTablePagingService().countComments();
        Double dblTotPage = Math.ceil(totalRows.doubleValue()/rowsPerPage.doubleValue());
        totalPage = dblTotPage.intValue();
        if (pageNumber == 1) {
            btnFirst.setEnabled(false);
            btnPrevious.setEnabled(false);
        } else {
            btnFirst.setEnabled(true);
            btnPrevious.setEnabled(true);
        }
        if (pageNumber.equals(totalPage)) {
            btnNext.setEnabled(false);
            btnLast.setEnabled(false);
        } else {
            btnNext.setEnabled(true);
            btnLast.setEnabled(true);
        }
        txtPageNumber.setText(String.valueOf(pageNumber));
        lblPageOf.setText(" of " + totalPage + " ");
        lblTotalRecord.setText("Total Record " + totalRows + " rows.");
        List wPComments = Main.getTablePagingService().findAllComment(pageNumber, rowsPerPage);
        jTable1.setModel(new CommentTableModel(wPComments));
        autoResizeColumn(jTable1);
    }    
    private void btnFirstActionPerformed(ActionEvent evt) {
        pageNumber = 1; initDefaultValue();
    }
    private void btnPreviousActionPerformed(ActionEvent evt) {
        if (pageNumber > 1) {
            pageNumber -= 1; initDefaultValue();
        }
    }
    private void btnNextActionPerformed(ActionEvent evt) {
        if (pageNumber 

A w warstwie usług, po prostu potrzebujesz funkcji limitu, jak poniżej:


public List findAllComment (Integer pageNumber, Integer rowsPerPage) {
        próbować {
            Lista listWP = new ArrayList ();
            preparedFindAll.setInt (1, (rowsPerPage * (pageNumber-1)));
            preparedFindAll.setInt (2, rowsPerPage);
            ResultSet rs = preparedFindAll.executeQuery ();
            while (rs.next ()) {
                WPComment comment = new WPComment ();
                comment.setCommentID (rs.getInt ("comment_ID"));
                comment.setCommentAuthor (rs.getString ("comment_author"));
                comment.setCommentDate (rs.getDate ("comment_date"));
                comment.setCommentContent (rs.getString ("comment_content"));
                listWP.add (komentarz);
            }
            return listWP;
        } catch (SQLException ex) {
            Logger.getLogger (TablePagingServiceJDBC.class.getName ()). Log (Level.SEVERE, null, ex);
        }

        return null;
    }

    public Integer countComments () {
        próbować {
            Integer totalRows = 0;
            ResultSet rs = preparedCount.executeQuery ();
            while (rs.next ()) {
                totalRows = rs.getInt ("count (*)");
            }
            return totalRows;
        } catch (SQLException ex) {
            Logger.getLogger (TablePagingServiceJDBC.class.getName ()). Log (Level.SEVERE, null, ex);
        }

        return 0;
    }

0
2018-01-31 09:26





Napisałem narzędzie do stronicowania w języku Java dataj. Używa JQuery DataTables podłącz metadane paginacji, aby utworzyć stronę wyników. Dodałem również kilka klas klienckich dla Java Swing, w tym TableRowSorter, który wywołuje sortowanie (po stronie serwera) zamiast sortowania wewnątrz modelu tabeli. Możesz go pobrać i skontaktować się ze mną, jeśli masz jakieś pytania. Jest na licencji Apache 2.


0
2018-03-24 20:51





Alternatywnie możesz skorzystać z QuickTable projekt.

Zrzut ekranu

Tutaj jest DBTable składnik w działaniu:

DBTable component, embedded in JFrame, with data loaded from a CSV file.

The DBTable składnik jest osadzony w tradycji JFrame.

Przykładowy kod

Poniższy przykładowy kod wyświetla okno pokazane na poprzednim zrzucie ekranu:

import javax.swing.JFrame;
import javax.swing.UIManager;

import quick.dbtable.DBTable;

public class QuickTableFrame extends JFrame {

    private static final long serialVersionUID = -631092023960707898L;

    public QuickTableFrame() {
        try {
            // Use system look and feel
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

            // set Frame properties
            setSize(300, 200);
            setVisible(true);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            // create a new quicktable
            DBTable dBTable1 = new DBTable();

            // add to frame
            getContentPane().add(dBTable1);

            // set the database driver to be used, we are using jdbc-odbc driver
            dBTable1.setDatabaseDriver("org.h2.Driver");

            /*
             * set the jdbc url,"quicktabledemo" is the data source we have
             * created for the database
             */
            dBTable1.setJdbcUrl("jdbc:h2:mem:test;INIT=create table employee as select * from CSVREAD('test.csv');");

            // set the select statement which should be used by the table
            dBTable1.setSelectSql("select * from employee");

            // to create the navigation bars for the table
            dBTable1.createControlPanel();

            // connect to database & create a connection
            dBTable1.connectDatabase();

            // fetch the data from database to fill the table
            dBTable1.refresh();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // create a new table frame
        QuickTableFrame myframe = new QuickTableFrame();
    }
}

Zasoby i zależności

test.csv

empid,emp_name,emp_dept,emp_salary
1,Azalia,ornare,114918
2,Jade,tristique,152878
3,Willa,In scelerisque scelerisque,166733
...

H2

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.187</version>
</dependency>

Referencje


0
2018-05-01 12:00



Zastanawiałem się, czy tego użyć. Jednak licencja LGPL na QuickTable nie jest zgodna z EPL. - Stefan
@Stefan Oto alternatywa: java-swing-tips.blogspot.fr/2008/03/... - Stephan