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