JTable行限制

时间:2011-05-30 10:30:28

标签: swing jtable java

我必须限制JTable中的行数。如果我有100条记录,我需要在初始加载JTable时显示10条。我想放一个像"next"这样的按钮,每次点击后它会显示另一组10条记录。

3 个答案:

答案 0 :(得分:11)

  

我必须限制JTable中的行数。如果我有100条记录,我需要在初始加载JTable时显示10条。

使用首选大小(+适当的布局和布局约束)来修复大小。

  

我想放一个像“下一个”的按钮,每次点击后它会显示另一组10条记录。

删除滚动窗格的RHS上的滚动条。然后使用按钮代替“下一个/上一个”的效果。

喜欢这个

Pageable table

FixedRowsTable.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

class FixedRowsTable {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                String[] columns = {"1","2","3","4","5","6","7"};
                Integer[][] data = new Integer[1000][columns.length];
                for (int xx=0; xx<data.length; xx++) {
                    for (int yy=0; yy<data[0].length; yy++) {
                        data[xx][yy] = new Integer((xx+1)*(yy+1));
                    }
                }
                final int rows = 11;

                JPanel gui = new JPanel(new BorderLayout(3,3));

                final JTable table = new JTable(
                    new DefaultTableModel(data, columns));

                final JScrollPane scrollPane = new JScrollPane(
                    table,
                    JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                Dimension d = table.getPreferredSize();
                scrollPane.setPreferredSize(
                    new Dimension(d.width,table.getRowHeight()*rows));

                JPanel navigation = new JPanel(
                    new FlowLayout(FlowLayout.CENTER));
                JButton next = new JButton(">");
                next.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        int height = table.getRowHeight()*(rows-1);
                        JScrollBar bar = scrollPane.getVerticalScrollBar();
                        bar.setValue( bar.getValue()+height );
                    }
                } );
                JButton previous = new JButton("<");
                previous.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        int height = table.getRowHeight()*(rows-1);
                        JScrollBar bar = scrollPane.getVerticalScrollBar();
                        bar.setValue( bar.getValue()-height );
                    }
                } );

                navigation.add(previous);
                navigation.add(next);

                gui.add(scrollPane, BorderLayout.CENTER);
                gui.add(navigation, BorderLayout.SOUTH);

                JOptionPane.showMessageDialog(null, gui);
            }
        });
    }
}

答案 1 :(得分:2)

如果您使用AbstractTableModel,则可以显示数百万条记录。我们的想法是,您的模型将根据需要加载视图所需的任何记录。

这里有这样一个模型。这不是我最好的代码,但会做:-) ......

public class SomeTableModel extends AbstractTableModel {

    public SomeTableModel(ResultSet rs) {
        this.rs = rs;
        try {
            pos = this.rs.getRow();
            System.out.println(String.valueOf(pos));
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex);
        }

    }

    public int getRowCount() {
        int cnt = 0;
        int apos = 0;
        try {
            apos = rs.getRow();
            rs.last();
            cnt = rs.getRow();
            if (apos > 0)
                rs.absolute(apos);
        } catch (SQLException ex) {
            System.out.println("getRowCount: " + ex);
        }

        return cnt;
    }

    public int getColumnCount() {
        return 3;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        // make it jump back to pos !!
        Object val = null;
        Integer intVal;

        try {
            if (rowIndex == 0) {
                pos = rs.getRow();
                total = getRowCount();
            }
            rs.absolute(rowIndex + 1);
            switch (columnIndex) {
                case 0: intVal = rs.getInt(1); val = intVal; break;
                case 1: val = rs.getString(2); break;
                case 2: val = rs.getString(3); break;
                default: val = "error";
            }
            rs.absolute(pos);
        } catch (SQLException sqle) {
            JOptionPane.showMessageDialog(null, "Trouble in model");
        }
        return val;
    }

    private ResultSet rs;
    private int pos, total;
}

答案 2 :(得分:1)

如果要从数据库表加载数据,我认为最好的方法是限制来自数据库的数据。然后对下一个和上一个按钮应用一个简单的算法。