Как обеспечить поддержку нумерации страниц для JTable в Swing?

Я создал один графический интерфейс в Swing Java, в котором я использовал JTable. Теперь я хочу отобразить в нем информацию о следующей странице, используя разбиение на страницы. Как мне это сделать?


person om.    schedule 26.09.2009    source источник
comment
См. также: stackoverflow.com/a/29986447/363573   -  person Stephan    schedule 09.04.2019


Ответы (5)


Пейджинг в Swing JTable выглядит как хорошая статья.

Вот отрывок:

Насколько я помню, решение этой проблемы кроется в концепции пейджинга: просто извлекать данные, которые хочет видеть пользователь, и ничего более. Это также означает, что вам иногда приходится получать дополнительные данные с сервера БД (или сервера приложений), если ваш пользователь прокручивает список вниз.

Меня очень удивило, что на самом деле не было готовых решений (даже копипастов) для этой проблемы. Любой, кто знает один, пожалуйста, не стесняйтесь расширять мои (довольно ограниченные) знания о платформе J2EE.

Поэтому мы копались и пытались найти решение самостоятельно. В конце концов мы придумали адаптированный класс TableModel для управления пейджингом.

person Petros    schedule 26.09.2009

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

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

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);

}

замещающий текст http://img7.imageshack.us/img7/4205/picture4qv.png< /а>

person akf    schedule 26.09.2009

Вы можете попробовать с 2 запросами, первый запрос для подсчета общего количества строк в БД, а второй запрос для реальных данных :) А для пользовательского интерфейса вы можете попробовать так:


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 

And in service layer, you just need use limit function like this :


public List findAllComment(Integer pageNumber, Integer rowsPerPage) {
        try {
            List 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(comment);
            }
            return listWP;
        } catch (SQLException ex) {
            Logger.getLogger(TablePagingServiceJDBC.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public Integer countComments() {
        try {
            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;
    }

Или вы можете разветвить меня на github по адресу Страница проекта Пейджинг таблицы в Swing< /а> :)

person martinusadyh    schedule 31.01.2011

Я написал инструмент разбиения на страницы Java dataj. Он использует метаданные разбиения на страницы подключаемого модуля JQuery dataTables для создания страницы результатов. Я также добавил несколько клиентских классов для Java Swing, включая TableRowSorter, который вызывает сортировку (на стороне сервера) вместо сортировки внутри табличной модели. Не стесняйтесь скачать его и свяжитесь со мной, если у вас есть какие-либо вопросы. Это под лицензией Apache 2.

person andy    schedule 24.03.2014

Кроме того, вы можете использовать проект QuickTable.

Снимок экрана

Вот компонент DBTable в действии:

Компонент DBTable, встроенный в JFrame, с данными, загружаемыми из файла CSV.

Компонент DBTable встроен в традиционный компонент JFrame.

Образец кода

Следующий пример кода создает окно, показанное на предыдущем снимке экрана:

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();
    }
}

Ресурсы и зависимости

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>

использованная литература

person Stephan    schedule 01.05.2015
comment
Я решил использовать это. Однако лицензия LGPL для QuickTable несовместима с EPL. - person Stefan; 01.07.2015
comment
@Stefan Вот альтернатива: java-swing -tips.blogspot.fr/2008/03/ - person Stephan; 10.10.2015