Pernah harus membuat sebuah table di java dimana satu atau lebih kolomnya harus static/fixed dan berada diposisi  yang sama secara horizontal seperti dibawah ini?

Fixed Column Table 1 : Kolom nomer tetap terlihat walaupun tabel di scroll kekanan.

Fixed Column Table 2 : Kolom didesain sebagai  header & selalu tetap pada tempatnya.

Tanpa basa-basi berikut source code swing modification dan penjelasannya :


import java.awt.Color;
import java.awt.Component;
import java.beans.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class FixedColumnTable implements ChangeListener, PropertyChangeListener
{
    private JTable mainTable;
    private JTable fixedTable;
    private JScrollPane scrollPane;

    public FixedColumnTable(int columnsToBeFix, JScrollPane scrollPaneOfMainTable)
    {
        this.scrollPane = scrollPaneOfMainTable;

        mainTable = ((JTable)scrollPaneOfMainTable.getViewport().getView());
        mainTable.setAutoCreateColumnsFromModel( false );
        mainTable.addPropertyChangeListener( this );

        //Menggunakan tabel (utama/main) pada parameter untuk membuat fixed tabel/kolom

        fixedTable = new javax.swing.JTable();

        fixedTable.setAutoCreateColumnsFromModel( false );
        fixedTable.setModel( mainTable.getModel() );
        fixedTable.setSelectionModel( mainTable.getSelectionModel() );
        fixedTable.setFocusable( false );

        //Menghilangkan fixed kolom dari main table
        //dan menambahkannya ke dalam fixed table

        for (int i = 0; i < columnsToBeFix; i++)
        {
            TableColumnModel columnModel = mainTable.getColumnModel();
            TableColumn column = columnModel.getColumn( 0 );
            columnModel.removeColumn( column );
            fixedTable.getColumnModel().addColumn( column );
        }

        //Menambahkan fixed table ke dalam scroll pane

        fixedTable.setPreferredScrollableViewportSize(fixedTable.getPreferredSize());
        scrollPaneOfMainTable.setRowHeaderView( fixedTable );
        scrollPaneOfMainTable.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader());

        //Sinkronasi scrolling dari row header milik fixed table dengan main table
        scrollPaneOfMainTable.getRowHeader().addChangeListener( this );
    }

    //mengembalikan fixed table untuk digunakan jika diperlukan
    public JTable getFixedTable()
    {
        return fixedTable;
    }
    public void stateChanged(ChangeEvent e)
    {
       //menjaga agar fixed table tetap sinkron dengan main table saat stateChanged
       JViewport viewport = (JViewport) e.getSource();
       scrollPane.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
    }

    public void propertyChange(PropertyChangeEvent e)
    {
        //menjaga agar fixed table sinkronasi dengan main table saat propertyChanged
        if ("selectionModel".equals(e.getPropertyName()))
        {
            fixedTable.setSelectionModel( mainTable.getSelectionModel() );
        }

        if ("model".equals(e.getPropertyName()))
        {
            fixedTable.setModel( mainTable.getModel() );
        }
    }
}

Selanjutnya jika diperlukan untuk mengganti warna fixed table/column nya, cukup replace baris 24 (yang highlighted) dengan source code dibawah ini :

fixedTable = new javax.swing.JTable()
{
    //change color of fixed table
    @Override
    public Component prepareRenderer(TableCellRenderer renderer,int rowIndex, int vColIndex)
    {

        Component c = super.prepareRenderer(renderer, rowIndex,    vColIndex);
        if (vColIndex==0)
        {
            c.setBackground(Color.LIGHT_GRAY);
        }

        return c;

    }
 };

Mudahkan? Selamat mencoba, semoga bermanfaat. Maju terus developer java Indonesia!😉

Untuk informasi post terbaru :