【问题标题】:Fill row values to SWING JTable JAVA using an arrayList values使用 arrayList 值将行值填充到 SWING JTable JAVA
【发布时间】:2015-01-15 08:41:52
【问题描述】:

我想根据 arrayList 数据动态添加和填充行到 JTable。 JTable 列标题是固定的。例如:3 根据列数逐行显示。

这里的 values1 是一个数组列表。它包含所有行数据值。

values2 是另一个数组列表,用于根据列数提取行值。

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

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

我使用此代码将行添加到 JTable。

       Object jFill[] = values2.toArray();

        model.addRow(jFill);

由于列数为 3,它将仅填充第一行(水平 3 个单元格)。 如何根据内部的值填充其他数据以增加行号 价值观2。

谢谢。

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应

标签: java swing arraylist


【解决方案1】:

尝试以下操作,遍历列表并将每三个值放在一行中(如果您有 3 列):

 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);
    }

 }

【讨论】:

  • 运行 for 循环时(在第一轮中),它将得到 v =0 ,如果条件计数器为 0,并且由于条件为 true ,请进入 if。然后将元素添加到 values2 arrayList。然后递增计数器。然后检查 if (counter==3||v>=values1.size).this if 是否为假。所以它将再次运行 for 循环第二轮。那么v=1;计数器=1,如果(计数器
  • 是否要检查值是否已经插入到列表中并避免添加它们?
【解决方案2】:

这是我的完整工作表模型,您可以添加行删除行并更改值。

您可以轻松地添加到您的框架中:

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

表格类:

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();
        }
    }


}

【讨论】:

  • for(int i=0;i
  • 或使用setRowCount(0)
  • 实际上它非常适合我。我知道 getRowCount 有什么问题:/
  • @Csanesz:API 说的很清楚,如图here
【解决方案3】:

这是一个使用数组而不是数组列表的简单实现,并且支持动态添加列(或行,如果我们对代码进行细微调整):

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);
  }
}

您可以将数据库中的数据提取代码添加到硬编码数组中。

输出截图:

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 2012-02-26
    • 2023-03-30
    • 2012-01-27
    • 1970-01-01
    • 2018-12-14
    • 2015-06-17
    • 2016-01-01
    • 2015-09-09
    相关资源
    最近更新 更多