0

I want to add and fill rows dynamically to JTable according to the arrayList data. JTable column headers are fixed. for ex: 3 According to the column count, row by row should display.

Here values1 is a arrayList. It contains all row data values.

values2 is another array list to extract row values according to the number of columns.

for (int v = 0; v < values1.size(); v++) {

            values2.add(values1.get(v));
        }

I add row to JTable using this code.

       Object jFill[] = values2.toArray();

        model.addRow(jFill);

It will fill only first row ( 3 cells horizontally) since column count is 3. How can I fill other data increasing the row number according to the values inside the values2 .

Thank you.

  • 1
    Consider providing a [runnable example](https://stackoverflow.com/help/mcve) which demonstrates your problem. This will result in less confusion and better responses – MadProgrammer Nov 18 '14 at 08:31

3 Answers3

0

Try the following, loop throught the list and put every three values in a row (if you have 3 columns):

 int counter=0;
 for (int v = 0; v < values1.size(); v++) {
    if(counter<3){
      values2.add(values1.get(v));
      counter++;
    }
    if(counter==3||v>=values1.size){
      Object jFill[] = values2.toArray();
      model.addRow(jFill);
    }

 }
cнŝdk
  • 31,391
  • 7
  • 56
  • 78
  • When running the for loop (in the 1st round) it will get v =0 , if condition counter as 0, and since the condition is true , go inside the if. then add elements to values2 arrayList. Then increment counter. Then check for if (counter==3||v>=values1.size).this if is false. so it will run again the for loop 2nd round. then v= 1; counter =1, go inside if(counter<3). then it will add the second element in the arrayList. Like that up to 3rd element it works.then add those values to jFill[]. but again checking for same inserted values. Iwant to drop them from array and insert nxt elemnts – Cristine Angelena Nov 18 '14 at 10:25
  • Do you want to check if the values are already inserted in the List and avoid adding them? – cнŝdk Nov 18 '14 at 10:38
0

Here my full working table model that works and you can add rows remove rows and change values.

You can easly add to your frame:

    protected MyTableModel mytableModel = new MyTableModel();
    scroll = new JScrollPane(mytableModel);

The table class:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

import org.apache.poi.ss.usermodel.Header;

class MyTableModel extends JPanel   {



    private static final int CHECK_COL = 5;
    private static  Object[][] DATA = { };
    public static String[] COLUMNS = {"Col1","Col2","Col3","Col4","Col5", "Checkbox"};
    protected DataModel dataModel = new DataModel(DATA, COLUMNS);
    private JTable table = new JTable(dataModel);
    private DefaultListSelectionModel selectionModel;

    public MyTableModel(){
        super(new BorderLayout());
        this.add(new JScrollPane(table));
        this.add(new ControlPanel(), BorderLayout.SOUTH);
        table.setPreferredScrollableViewportSize(new Dimension(250, 175));
        selectionModel = (DefaultListSelectionModel) table.getSelectionModel();
        JTableHeader header = table.getTableHeader();
        header.setDefaultRenderer(new HeaderRenderer(table));
    }


    private class DataModel extends DefaultTableModel {


        public DataModel(Object[][] data, Object[] COLUMNS) {
            super(data, COLUMNS);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == CHECK_COL) {
                return getValueAt(0, CHECK_COL).getClass();
            }
            return super.getColumnClass(columnIndex);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            if(column==CHECK_COL && !Main.checked)
                return true;
            return false;
        }

    }
    private static class HeaderRenderer implements TableCellRenderer {

        DefaultTableCellRenderer renderer;

        public HeaderRenderer(JTable table) {
            renderer = (DefaultTableCellRenderer)
                table.getTableHeader().getDefaultRenderer();
            renderer.setHorizontalAlignment(JLabel.CENTER);
        }

        @Override
        public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int col) {
            return renderer.getTableCellRendererComponent(
                table, value, isSelected, hasFocus, row, col);
        }
    }

    private class ControlPanel extends JPanel {

        /**
         * 
         */
         private static final long serialVersionUID = -7342459414751761853L;

        public ControlPanel() {
            //   this.add(new JLabel("Selection:"));
            //  this.add(new JButton(new SelectionAction("Clear", false)));
            //    this.add(new JButton(new SelectionAction("Check", true)));
        }
    }



    private class SelectionAction extends AbstractAction {

        boolean value;

        public SelectionAction(String name, boolean value) {
            super(name);
            this.value = value;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < dataModel.getRowCount(); i++) {
                if (selectionModel.isSelectedIndex(i)) {

                    dataModel.setValueAt(value, i, CHECK_COL);
                }
            }
        }
    }



    public void setValueAt_Cell(String val, int row, int col) {
        // TODO Auto-generated method stub
        if(row>=dataModel.getRowCount()){
            dataModel.addRow(new Object[] {"","","","","",false});

        }
        dataModel.setValueAt(val, row, col);
    }



    public String getValAtPos(int row,int col) {
        //System.out.println(dataModel.getValueAt(row, col));
        if(row>=dataModel.getRowCount()){
            return null;
        }
        return dataModel.getValueAt(row, col).toString();
    }

    public int getRowCount(){
        return DATA.length;
    }
    public boolean get_checked_row(int row){
        return (boolean) dataModel.getValueAt(row, 5);
    }



    public void clear() {
        while(dataModel.getRowCount()!=0){
            for(int i=0;i<dataModel.getRowCount();i++){
                dataModel.removeRow(i);     
            }
            dataModel.fireTableRowsDeleted(0, getRowCount());
            dataModel.fireTableDataChanged();
        }
    }


}
SüniÚr
  • 826
  • 1
  • 16
  • 33
0

Here's a simple implementation using array instead of arraylist, and supports dynamic addition of columns (or rows if we apply minor tweaks to the code):

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Test {
  public static void main(String[] argv) throws Exception {
    DefaultTableModel model = new DefaultTableModel();
    JTable table = new JTable(model);
    model.addColumn("Header");

    String[] headers = { //If you wish to separate the headers array from columns array
        "Header 1",
        "Header 2",
        "Header 3"
    };
    String [][]columnData = new String[][]{
        {
            "Column 1.1",
            "Column 1.2",
            "Column 1.3"
        },{
            "Column 2.1",
            "Column 2.2",
            "Column 2.3"
        },{
            "Column 3.1",
            "Column 3.2",
            "Column 3.3"
        }
    };

    for(int col=1;col<(columnData.length+1);col++){
        model.addColumn("Col"+col);
    }
    for(int i=0;i<headers.length;i++){
        model.addRow(new Object[] { headers[i] });
    }
    for(int r=0;r<columnData.length;r++){
        for(int c=0;c<columnData[0].length;c++){
            model.setValueAt(columnData[r][c],c,r+1);
        }
    }        
    JFrame f = new JFrame();
    f.setSize(500, 300);
    f.add(new JScrollPane(table));
    f.setVisible(true);
  }
}

You may add in your database data-pulling codes into the hard-coded arrays instead.

A screenshot of output:

enter image description here

George
  • 6,006
  • 6
  • 48
  • 68