Java Source - JTable Fixed Row


Một ví dụ khá hay mổ ta cách tạo ra các dòng dữ liệu cố định(fix row) trong JTable của Java. Bạn có thể tượng trong excel đôi khi bạn muốn một số dòng cố định hiển thị trong khi các dòng còn lại thì vẫn sử dụng thanh trược scroll để di chuyển lên xuống.




FixedRowExample.java
//Example modified from http://www.crionics.com/products/opensource/faq/swing_ex/JTableExamples2.html
//Original example doesn't work

/**
 * @version 1.0 12/03/98
 */

/* (swing1.1.1beta1) */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

/**
 * @version 1.0 03/05/99
 */
public class FixedRowExample extends JFrame {

    Object[][] data;
    Object[] column;
    JTable fixedTable, table;
    private int FIXED_NUM = 2;

    public FixedRowExample() {
        super("Fixed Row Example");

        data = new Object[][]{
            {"a", "", "", "", "", ""},
            {"", "b", "", "", "", ""},
            {"", "", "c", "", "", ""},
            {"", "", "", "d", "", ""},
            {"", "", "", "", "e", ""},
            {"", "", "", "", "", "f"},
            {"fixed1", "", "", "", "", "", "", ""},
            {"fixed2", "", "", "", "", "", "", ""}};
        column = new Object[]{"A", "B", "C", "D", "E", "F"};

        AbstractTableModel model = new AbstractTableModel() {
            @Override
            public int getColumnCount() {
                return column.length;
            }

            @Override
            public int getRowCount() {
                return data.length - FIXED_NUM;
            }

            @Override
            public String getColumnName(int col) {
                return (String) column[col];
            }

            @Override
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }

            @Override
            public void setValueAt(Object obj, int row, int col) {
                data[row][col] = obj;
            }

            public boolean CellEditable(int row, int col) {
                return true;
            }
        };

        AbstractTableModel fixedModel = new AbstractTableModel() {
            @Override
            public int getColumnCount() {
                return column.length;
            }

            @Override
            public int getRowCount() {
                return FIXED_NUM;
            }

            @Override
            public Object getValueAt(int row, int col) {
                return data[row + (data.length - FIXED_NUM)][col];
            }
        };

        table = new JTable(model);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        fixedTable = new JTable(fixedModel);
        fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        JScrollPane scroll = new JScrollPane(table);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);


        JScrollPane fixedScroll = new JScrollPane(fixedTable) {
            @Override
            public void setColumnHeaderView(Component view) {
            } // work around
        };


        fixedScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        JScrollBar bar = fixedScroll.getVerticalScrollBar();
        JScrollBar dummyBar = new JScrollBar() {
            @Override
            public void paint(Graphics g) {
            }
        };
        dummyBar.setPreferredSize(bar.getPreferredSize());
        fixedScroll.setVerticalScrollBar(dummyBar);

        final JScrollBar bar1 = scroll.getHorizontalScrollBar();
        JScrollBar bar2 = fixedScroll.getHorizontalScrollBar();
        bar2.addAdjustmentListener(new AdjustmentListener() {
            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                bar1.setValue(e.getValue());
            }
        });


        scroll.setPreferredSize(new Dimension(400, 100));
        fixedScroll.setPreferredSize(new Dimension(400, 52)); // Hmm...
        getContentPane().add(scroll, BorderLayout.CENTER);
        getContentPane().add(fixedScroll, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        FixedRowExample frame = new FixedRowExample();
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.pack();
        frame.setVisible(true);
    }
}


Kết quả - Result



Source: KidsLovePC






No comments:

Post a Comment