0

So i'm creating a class that create a table with row headers and column header. this class will be called in another class to create different tables with the same layout. The jtable will be created using getters and setters The rowheader table will be also created using the getters and setter later on.

From stackOverflow i have tried many posts like these ones https://stackoverflow.com/questions/26248084/how-to-display-row-header-on-jtable-instead-of-column-header https://stackoverflow.com/questions/1434933/jtable-row-header-implementation

and of course other methods from other blogs that create cell renderer etc unfortunately the roheader is not displaying so i have tryed my code and it is giving me exactly what is expected to be displayed except that the size of the rowheader view is oversized and i will need to resize it (did not find on the net how to do it ).

here is the code and i hope to get some help from you how to resize it.


import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.border.BevelBorder;

import java.awt.Dimension;

/**
 * @author kannou
 *
 */
public class TableWithRowAndColumHeader extends JScrollPane {
    
    
    
    /**
     * 
     */
    private static final long serialVersionUID = -7156534750062633160L;
    private Object [] rowNames;
    private JTable rowHeaderTable;
    private JTable mainTable;
    private String[] columnNames;
    private Object[][] data;
    private DefaultTableModel rowheadertableModel;
    public TableWithRowAndColumHeader() {
        setViewportBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
        setAutoscrolls( true );
        rowheadertableModel = new DefaultTableModel(
                new Object[][] {
                    {"row1"},
                    {"row2"},
                    {"row3"},
                    {"row4"},
                },
                new String[] {
                    ""
                }
            );// to be removed later and replaced by getter and setter so we can make a call from any other class
        rowHeaderTable = new JTable();
        rowHeaderTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        rowHeaderTable.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
        rowheadertableModel = getRowheadertableModel();
        rowHeaderTable.setModel(rowheadertableModel);
        rowHeaderTable.setBackground(getBackground());
        rowHeaderTable.setCellEditor(null);
        setRowHeaderView(rowHeaderTable);
    
        
        mainTable = new JTable();
        mainTable.setPreferredScrollableViewportSize(new Dimension(700, 400));
        mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        data = new Object[][] {
            {null, null, null, null, null},
            {null, null, null, null, null},
            {null, null, null, null, null},
            {null, null, null, null, null}
        };// to be removed later and replaced by getter and setter so we can make a call from any other class
        columnNames = new String[] {"New column1", "New column2", "New column3", "New column4", "New column5"};
        mainTable.setModel(new DefaultTableModel(data,columnNames));
        setViewportView(mainTable);
        
    }

    // Getters and setter for the different declarations can be used later
    /**
     * @return the rowNames
     */
    public Object[] getRowNames() {
        return rowNames;
    }
    /**
     * @param rowNames the rowNames to set
     */
    public void setRowNames(Object[] rowNames) {
        this.rowNames = rowNames;
    }
    
    /**
     * @return the rowheadertableModel
     */
    public DefaultTableModel getRowheadertableModel() {
        return rowheadertableModel;
    }




    /**
     * @param rowheadertableModel the rowheadertableModel to set
     */
    public void setRowheadertableModel(DefaultTableModel rowheadertableModel) {
        this.rowheadertableModel = rowheadertableModel;
    }


}


enter image description here

Solution: After looking to members posts (I must search for the post to make credits to him) and suggestion i found a relevent code that shows Jtable with row and column header on a Jframe. So i have transmformed the code to a be a class that can be called from anywhere to show data:

  • Transformation done is that we extend JScrollPane instead of JFrame
  • We create getters and setters to set the rownames and the dataTableModel
  • There is a methode called populateTable() this is needed so that we will not get an exception null point because when the procedure is launched the rowheader model is empty and there is nothing to display

Finally the code


import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.AbstractListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;
import javax.swing.border.BevelBorder;


/**
 * @author kannou
 *
 */
public class tablewithheaders extends JScrollPane{
    /**
     * 
     */
    private static final long serialVersionUID = -1489710725878121346L;
    private JTable datatable;
    public JScrollPane rightScrollpane;
    private DefaultTableModel rowTableModel;
    private DefaultTableModel dataTableModel;
    private AbstractListModel<Object> lm;
    private  JList<Object> rowHeader;
    private String[] rownames;
    public tablewithheaders() {
        
        createScrollpane();
        createTables();

    }
    public void populateTable() {
        
        dataTableModel = getDataTableModel();
        datatable.setModel(dataTableModel);
        lm = new AbstractListModel<Object>() {
              /**
                 * 
                 */
                private static final long serialVersionUID = -5594185448072280078L;
            String headers[] = getRownames();

              @Override
              public int getSize() {
                return headers.length;
              }

              @Override
              public Object getElementAt(int index) {
                return headers[index];
              }
            }; 
            
            rowHeader = new JList<Object>(lm);
            rowHeader.setFixedCellWidth(50);
            // ***************  CODE ADDED  *******************
            // Add a Mouse Motion Listener for the rowHeader JList.
            rowHeader.addMouseMotionListener(new MouseMotionListener() {
                @Override
                public void mouseDragged(MouseEvent e) {
                    // Set the list cell width as mouse is dragged.
                    rowHeader.setFixedCellWidth(e.getX());
              }

                @Override
                public void mouseMoved(MouseEvent e) {
                    // If the mouse pointer is near the end region of the 
                    // list cell then change the mouse cursor to a resize cursor.
                    if ((e.getX()>= (rowHeader.getWidth() - 5)) && (e.getX()<= rowHeader.getWidth())) {
                        rowHeader.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
                    } 
                    // If the mouse pointer is not near the end region of a cell 
                    // then change the pointer back to its default.
                    else {
                        rowHeader.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    }
                }
            });
            // ***********************************************  

            rowHeader.setFixedCellHeight(datatable.getRowHeight());
            
            rowHeader.setCellRenderer(new RowHeaderRenderer2(datatable));

            setRowHeaderView(rowHeader);
    }
    
    public void createScrollpane() {
    
        setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
        setAutoscrolls(true);
        setAlignmentX(Component.RIGHT_ALIGNMENT);
        
    }
    
    public void createTables() {
        
        this.datatable = new JTable();
        datatable.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
        datatable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        setViewportView(datatable);
        
        
    }
    /**
     * @return the rowTableModel
     */
    public DefaultTableModel getRowTableModel() {
        return rowTableModel;
    }
    /**
     * @param rowTableModel the rowTableModel to set
     * @return 
     */
    public DefaultTableModel setRowTableModel(String [] rowNames) {
        rowTableModel = new DefaultTableModel();
        rowTableModel.addColumn(" ", rowNames);
        return rowTableModel;
    }


    /**
     * @return the dataTableModel
     */
    public DefaultTableModel getDataTableModel() {
        return dataTableModel;
    }


    /**
     * @param dataTableModel the dataTableModel to set
     */
    public void setDataTableModel(DefaultTableModel dataTableModel) {
        this.dataTableModel = dataTableModel;
    }
    /**
     * @return the rownames
     */
    public String[] getRownames() {
        return rownames;
    }
    /**
     * @param rownames the rownames to set
     */
    public void setRownames(String[] rownames) {
        this.rownames = rownames;
    }
}
@SuppressWarnings("rawtypes")
class RowHeaderRenderer2 extends JLabel implements ListCellRenderer {

      /**
         * 
         */
        private static final long serialVersionUID = -8052866760885435931L;
    private JTableHeader header;

    RowHeaderRenderer2(JTable table) {
        header = table.getTableHeader();
        setOpaque(true);
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        setHorizontalAlignment(CENTER);
        setForeground(header.getForeground());
        setBackground(header.getBackground());
        setFont(header.getFont());
      }

      @Override
      public Component getListCellRendererComponent(JList list, Object value,
          int index, boolean isSelected, boolean cellHasFocus) {
        setText((value == null) ? "" : value.toString());
        return this;
      }
    }

If there will be some improvements i will update the post

We learn by making mistakes and bad codes

0 Answers0