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];
}
}
}
本例中的两个 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];
}
}
}