Я создал один GUI в Swing Java, в котором я использовал JTable.Now, я хочу отображать в него информацию следующей страницы, используя разбиение на страницы. Как мне это сделать?
Как обеспечить поддержку разбивки на страницы JTable в Swing?
Ответ 1
Пейджинг в Swing JTable выглядит как хорошая статья.
Вот выдержка:
Насколько я помню, решение этой проблемы заключается в концепции пейджинга: просто извлекайте данные, которые пользователь хочет увидеть, и ничего больше. Это также означает, что вам иногда приходится получать дополнительные данные с сервера db (или сервера приложений), если ваш пользователь прокручивает список вниз.
Большим было мое удивление, что на эту проблему не было действительно готового решения (даже не решения для копирования-вставки). Любой, кто его знает, не стесняйтесь распространять мои (весьма ограниченные) знания о платформе J2EE.
Итак, мы вырыли и попытались сами построить решение. В итоге мы получили адаптированный класс TableModel для обработки пейджинга.
Ответ 2
Другим вариантом реализации этого является использование прокрутки без прокрутки и пару навигационных кнопок для управления. Кнопки, которые были добавлены, являются нормальными 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);
}
Ответ 3
Вы можете попробовать с 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 на Страница пейджинга страницы проекта на свинге:)
Ответ 4
Я написал инструмент разбивки на страницы dataj. Он использует JQuery dataTables плагины метаданных разбиения на страницы, чтобы создать страницу результатов. Я также добавил некоторые классы клиентов для Java Swing, включая TableRowSorter, который вызывает сортировку (на стороне сервера), а не сортировку внутри модели таблицы. Не стесняйтесь загружать его и связываться со мной, если у вас есть какие-либо вопросы. Он под лицензией Apache 2.
Ответ 5
В качестве альтернативы вы можете использовать проект QuickTable
.
Снимок экрана
Вот действующий компонент DBTable
:
Компонент 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
...
Н2
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.187</version>
</dependency>