JAVA SWING:默认使用的矢量 Table 模型无法通过 for 循环添加 addElement()

JAVA SWING: Vector used in Default Table Model fails to addElement() added through a for loop

本例中的两个 Jtable 显示了我面临的挑战。简单的说,一个table是一个Mastertable,而第二个则依赖于Mastertable的数据。 Master table 包含第 3 列为布尔值的数据,第二个 table 的目的只是显示第 3 列为真的所有数据(所有男性的姓名)。换句话说,就 Master table 上的第 3 列而言,所有错误的数据都不会显示。 问题是,当我 运行 代码时,第二个 table 中仅显示 one 元素,而 'Boolean=true' 的其他数据被忽略为如下所示。

我的代码可能有什么问题,无法在第二个上显示所有布尔真实数据 table.NOTE:我还尝试在循环中使用 DefaultTableModel addRow() 方法,但也未能显示所有数据从 MasterTable 的第 3 列来看也是如此。

public class ZoomTable extends JFrame{

    JPanel panel;
    Object [] masterColumns = new Object []{"Name","Age","Male"};
    Object [][] masterData = new Object [][]{
       {"Simon",10,new Boolean(true)},
       {"Jane",10,new Boolean(false)},
       {"Hellen",10,new Boolean(false)},
       {"Amos",10,new Boolean(true)},
       {"Brenda",10,new Boolean(false)},
       {"Dennis",10,new Boolean(true)},
       {"Mary",10,new Boolean(false)},
       };
    MasterTableModel mtm = new MasterTableModel(masterData,masterColumns);
    Vector<Vector> maleListData = new Vector<Vector>();
    Vector maleList = new Vector();
    public static void main(String[] args) {
       ZoomTable zoom = new ZoomTable();
       zoom.init();
       zoom.setVisible(true);
       zoom.setSize(new Dimension(600,800));
       zoom.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    void init(){
        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JTable masterTable = new JTable(masterData,masterColumns);
        JScrollPane spMaster = new JScrollPane();
        spMaster.setViewportView(masterTable);
        panel.add(spMaster,"North");

        Vector <String> tinyColumns = new Vector <String>();       
        tinyColumns.addElement("NAMES OF MALES");

        DefaultTableModel dtm = new           DefaultTableModel(maleListVector(),tinyColumns);
        JTable tinyTable = new JTable(dtm); 
        JScrollPane spTiny = new JScrollPane();
        spTiny.setViewportView(tinyTable);
        panel.add(spTiny,"Center");
        add(panel);
        pack();
    }

    public Vector maleListVector(){
        for(int k = 0;k < mtm.getRowCount();k++){

            if(mtm.getValueAt(k,2).equals(true)){
                String maleName = mtm.getValueAt(k,0).toString();
                maleList.addElement(maleName);
            System.out.println(maleName+" is Male");
            }
            else if(mtm.getValueAt(k,2).equals(false)){
                String femaleName = mtm.getValueAt(k,0).toString();
              System.out.println(femaleName+" is Female");
            }


         }
        maleListData.add(maleList);
     return maleListData;}
}

class MasterTableModel extends AbstractTableModel{
    Object [][] data;
    Object [] cols;

    MasterTableModel(Object[][] masterData, Object[] masterColumns) {
       data = masterData;
       cols = masterColumns;
    }

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

    @Override
    public int getColumnCount() {
       return cols.length;
    }

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

 }

DefaultTableModel 的数据是向量的向量。

您只能向 "maleListData" 添加一个向量,所以这意味着您有一行包含多列数据。

这个很容易验证。只需将您的代码更改为:

tinyColumns.addElement("NAMES OF MALES");
tinyColumns.addElement("2");

你会看到另一列数据。

所以您的问题的解决方案是为您找到的每个男性项目向 Vector 添加一行新数据:

//maleList.addElement(maleName);
Vector row = new Vector(1);
row.add(maleName);
maleListData.addElement( row );

...

//maleListData.add(maleList);

如其他答案中所述,这里的具体问题是您只将向量的第一个元素添加到 maleListData。要解决此问题,您可以像 camickr 那样创建一个包含一个元素的向量,然后在 for 循环的每次迭代中将其添加到 maleListData 中。或者您可以使用 addAll 方法并稍微修改您的代码。


一些建议。让你的代码更面向对象一点。使用泛型和关键字来处理范围,例如 private,可以使您的代码更具可读性和更容易理解。它还可以防止它以错误的方式使用。

在这种情况下,use of generics 我的意思是指定向量的类型,这样像 Eclipse 这样的 IDE 就不会向您发出大量警告。

例如,使用固定的 class。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Vector;

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

@SuppressWarnings("serial")
public class ZoomTable extends JFrame{
    private JPanel panel;
    private Object[] masterColumns = new Object[]{"Name","Age","Male"};
    private Object[][] masterData = new Object[][]{
        {"Simon", 10, true},
        {"Jane", 10, false},
        {"Hellen", 10, false},
        {"Amos",10, true},
        {"Brenda",10, false},
        {"Dennis",10, true},
        {"Mary",10, false},
    };
    private MasterTableModel mtm = new MasterTableModel(masterData,masterColumns);
    private Vector<Vector<Object>> maleListData = new Vector<Vector<Object>>();

    public static void main(String[] args) {
        ZoomTable zoom = new ZoomTable();
        zoom.init();
        zoom.setVisible(true);
        zoom.setSize(new Dimension(600,800));
        zoom.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void init(){
        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JTable masterTable = new JTable(masterData,masterColumns);
        JScrollPane spMaster = new JScrollPane();
        spMaster.setViewportView(masterTable);
        panel.add(spMaster,"North");

        Vector <String> tinyColumns = new Vector <String>();       
        tinyColumns.addElement("NAMES OF MALES");

        DefaultTableModel dtm = new DefaultTableModel(maleListVector(), tinyColumns);
        JTable tinyTable = new JTable(dtm); 
        JScrollPane spTiny = new JScrollPane();
        spTiny.setViewportView(tinyTable);
        panel.add(spTiny,"Center");
        add(panel);
        pack();
    }

    private Vector<Vector<Object>> maleListVector(){
        for(int k = 0;k < mtm.getRowCount();k++){
            if(mtm.getValueAt(k, 2).equals(true)){
                String maleName = mtm.getValueAt(k, 0).toString();
                Vector<Object> name = new Vector<Object>();
                name.add(maleName);
                maleListData.addElement(name);
                System.out.println(maleName + " is Male");
            } else if(mtm.getValueAt(k, 2).equals(false)){
                String femaleName = mtm.getValueAt(k, 0).toString();
                System.out.println(femaleName + " is Female");
            }
        }
        return maleListData;
    }

    private class MasterTableModel extends AbstractTableModel{
        Object[][] data;
        Object[] cols;

        MasterTableModel(Object[][] masterData, Object[] masterColumns) {
            data = masterData;
            cols = masterColumns;
        }

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

        @Override
        public int getColumnCount() {
            return cols.length;
        }

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