Java JTable 无法加载
Java JTable wont load
我有一个 HashMap<Person, ArrayList<Account>>
,我想要一个 table,其中包含来自 HashMap 的所有键(Persons)。问题是,如果我尝试在视图中创建它,table 是空的,但如果我在 main 中创建它(使用完全相同的代码),它会工作并填充数据。不知道为什么。
public class App
{
public static void main( String[] args )
{
View view = new View();
Bank b = new Bank();
Person p = new Person("Name","Prenume", "id");
Person p1 = new Person("Name2","Prenume2", "id2");
b.addPerson(p);
b.addPerson(p1);
view.personTbl = view.tablePers(b.mapper);
view.sp = new JScrollPane(view.personTbl);
view.personFrame.add(view.sp,BorderLayout.CENTER);
view.viewPers.setVisible(true);
}
}
如果我这样创建它是行不通的
public View() {
personFrame = new JFrame("Person");
personFrame.setLayout(new BorderLayout());
personFrame.setSize(400, 400);
persBtnsPan = new JPanel();
viewPers = new JFrame("View Pers");
viewPers.setLayout(new BorderLayout());
viewPers.setSize(400, 400);
viewPersPan = new JPanel();
addPerson = new JButton("add");
editPerson = new JButton("edit");
viewP = new JButton("view");
personTbl = tablePers(b.mapper);
sp = new JScrollPane(personTbl);
persBtnsPan.add(addPerson);
persBtnsPan.add(editPerson);
persBtnsPan.add(viewP);
personFrame.add(persBtnsPan, BorderLayout.NORTH);
personFrame.add(sp,BorderLayout.CENTER);
}
这是创建 table
的方法
public static <T> JTable tablePers(HashMap<Person, ArrayList<Account>> map) {
DefaultTableModel model = new DefaultTableModel(
new Object[] { "Nume", "Prenume", "CNP" }, 0);
for (HashMap.Entry<Person, ArrayList<Account>> entry : map.entrySet()) {
model.addRow(new Object[] { entry.getKey().getNume(), entry.getKey().getPrenume(), entry.getKey().getCnp() });
}
tab = new JTable(model);
return tab;
}
您遇到了引用问题,因为视图中的 b.mapper
与主视图中的不一样,但也不应该相同。但是 View 像这样处理数据是没有意义的。您需要将 model 直接或间接传递给 View,然后让 View 显示模型的状态。
例如,
public class App {
Bank b = new Bank(); // the model
//... do things with b here
View view = new View(b); // pass the model in
// and then in View's constructor use the model
}
此外,如果这是一个 M-V-C 程序,那么您的控制器将侦听视图和模型的更改,并将通知相关实体更改、更新模型和视图。
例如,
public static void main(String[] args) {
BankModel model = new BankModel();
model.addPerson(new BankPerson("LastName1", "FirstName1", "id1"));
model.addPerson(new BankPerson("LastName2", "FirstName2", "id2"));
BankView view = new BankView();
BankController controller = new BankController(model, view);
controller.displayGui();
}
我有一个 HashMap<Person, ArrayList<Account>>
,我想要一个 table,其中包含来自 HashMap 的所有键(Persons)。问题是,如果我尝试在视图中创建它,table 是空的,但如果我在 main 中创建它(使用完全相同的代码),它会工作并填充数据。不知道为什么。
public class App
{
public static void main( String[] args )
{
View view = new View();
Bank b = new Bank();
Person p = new Person("Name","Prenume", "id");
Person p1 = new Person("Name2","Prenume2", "id2");
b.addPerson(p);
b.addPerson(p1);
view.personTbl = view.tablePers(b.mapper);
view.sp = new JScrollPane(view.personTbl);
view.personFrame.add(view.sp,BorderLayout.CENTER);
view.viewPers.setVisible(true);
}
}
如果我这样创建它是行不通的
public View() {
personFrame = new JFrame("Person");
personFrame.setLayout(new BorderLayout());
personFrame.setSize(400, 400);
persBtnsPan = new JPanel();
viewPers = new JFrame("View Pers");
viewPers.setLayout(new BorderLayout());
viewPers.setSize(400, 400);
viewPersPan = new JPanel();
addPerson = new JButton("add");
editPerson = new JButton("edit");
viewP = new JButton("view");
personTbl = tablePers(b.mapper);
sp = new JScrollPane(personTbl);
persBtnsPan.add(addPerson);
persBtnsPan.add(editPerson);
persBtnsPan.add(viewP);
personFrame.add(persBtnsPan, BorderLayout.NORTH);
personFrame.add(sp,BorderLayout.CENTER);
}
这是创建 table
的方法 public static <T> JTable tablePers(HashMap<Person, ArrayList<Account>> map) {
DefaultTableModel model = new DefaultTableModel(
new Object[] { "Nume", "Prenume", "CNP" }, 0);
for (HashMap.Entry<Person, ArrayList<Account>> entry : map.entrySet()) {
model.addRow(new Object[] { entry.getKey().getNume(), entry.getKey().getPrenume(), entry.getKey().getCnp() });
}
tab = new JTable(model);
return tab;
}
您遇到了引用问题,因为视图中的 b.mapper
与主视图中的不一样,但也不应该相同。但是 View 像这样处理数据是没有意义的。您需要将 model 直接或间接传递给 View,然后让 View 显示模型的状态。
例如,
public class App {
Bank b = new Bank(); // the model
//... do things with b here
View view = new View(b); // pass the model in
// and then in View's constructor use the model
}
此外,如果这是一个 M-V-C 程序,那么您的控制器将侦听视图和模型的更改,并将通知相关实体更改、更新模型和视图。
例如,
public static void main(String[] args) {
BankModel model = new BankModel();
model.addPerson(new BankPerson("LastName1", "FirstName1", "id1"));
model.addPerson(new BankPerson("LastName2", "FirstName2", "id2"));
BankView view = new BankView();
BankController controller = new BankController(model, view);
controller.displayGui();
}