JAVA SWING:在默认表模型中使用的向量无法通过for循环添加addElement()

时间:2018-08-04 14:00:38

标签: java swing vector jtable defaulttablemodel

此示例中的两个Jtables显示了面临的挑战。简而言之,一个表是主表,第二个表取决于主表数据。主表包含第3列为布尔值的数据,第二个表的目的仅仅是显示第3列上为true的所有数据(所有男性的姓名)。换句话说,就主表第3列而言,所有不正确的数据都不会显示。 问题是,当我运行代码时,第二个表中仅显示一个元素,而其他数据“ Boolean = true”则被忽略,如下所示。 enter image description here

我的代码可能出问题了,它无法在第二个表上显示所有布尔真实数据注:我还尝试在循环内使用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];
    }

 }

2 个答案:

答案 0 :(得分:1)

DefaultTableModel的数据是向量的向量。

您只能将一个Vector添加到“ 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);

答案 1 :(得分:1)

As mentioned in other answers, the specific problem here is you were only ever adding the first element of the vector to your maleListData. To fix this you could either create a vector with one element in, like camickr did, and add this to your maleListData in each iteration of your for loop. Or you could use the addAll method with a little modification of your code.


Some suggestions. Make your code a little more OOP. The use of generics and keywords to do with scope, like private, can make your code more readable and easier to understand. It also prevents it being used in the wrong way.

In this case by use of generics I mean specifying to types of your vectors so that IDEs like Eclipse don't throw a load of warnings at you.

For example, with your fixed 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];
        }
    }
}