此示例中的两个Jtables显示了面临的挑战。简而言之,一个表是主表,第二个表取决于主表数据。主表包含第3列为布尔值的数据,第二个表的目的仅仅是显示第3列上为true的所有数据(所有男性的姓名)。换句话说,就主表第3列而言,所有不正确的数据都不会显示。
问题是,当我运行代码时,第二个表中仅显示一个元素,而其他数据“ Boolean = true”则被忽略,如下所示。
我的代码可能出问题了,它无法在第二个表上显示所有布尔真实数据注:我还尝试在循环内使用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];
}
}
答案 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];
}
}
}