【发布时间】:2013-01-08 16:50:45
【问题描述】:
我有一个使用Model 的工作程序,该程序由Item 列表组成。
public class Model {
private List<Item>;}
public abstract class Item{}
public class A extends Item{}
public class B extends Item{}
public class C extends Item{}
但现在我需要创建一个带有一些操作按钮(添加、删除、编辑)的视图,其中 JTable 在中心显示特定项目(A、B、C)。 这是我的第一个问题,因为每个特定项目的一个字段都有一个列,所以我需要为每个项目使用不同的表。
一种解决方案可能是为每种类型的项目设置一个带有一个表格的卡片布局,但它带来了一个新问题,我的视图如何在不使用instanceof() 的情况下确定模型中有多少类型的项目?
此外,在此之后我还会遇到其他问题,如果我的视图中有 x jtable,我的视图将如何获得该表的模型?我可以为每个项目实现这样的接口:
public interface MyModel{
AbstractTableModel getModel();
}
但我只能给这个函数一个列表,那么每个项目如何只用它的项目类型填充数据数组?
PS:如果我进一步反思,我有一个额外的问题,我想知道我的操作按钮的侦听器如何简单地知道当前正在修改哪个 JTable,我是否应该将侦听器放在视图中以简化访问卡片布局?
如果需要改进我的问题,请提出要求!不确定问题目前是否明确。
编辑:添加 SSCCE,这是我的目标,但它目前不使用我的程序项目,也没有实现 TableModel/TableModelListener。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
public class View extends JPanel implements TableModelListener{
private static final long serialVersionUID = 1L;
private JTabbedPane card;
public View() {
Object rowData[][] = { { "1", "one", "I" }, { "2", "two", "II" }, { "3", "three", "III" } };
String columnNames[] = { "#", "English", "Roman" };
Object rowData2[][] = { { "1", "B" } };
String columnNames2[] = { "#", "type" };
setLayout(new BorderLayout());
JPanel actionbutton = new JPanel();
JButton but = new JButton("fire");
but.addActionListener(new ButtonListener());
actionbutton.add(but);
add(actionbutton,BorderLayout.SOUTH);
card = new JTabbedPane();
//something should determine how many type of object in a List<Item> w/o using instanceof
//should fill jtable with a specific TableModel for each item type
JTable card1 = new JTable(rowData,columnNames);
JTable card2 = new JTable(rowData2,columnNames2);
card.addTab("Item A",new JScrollPane(card1));
card.addTab("Item B",new JScrollPane(card2));
add(card,BorderLayout.CENTER);
}
private class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("fire".equals(cmd)) {
//do something on the model
}
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(800, 600);
f.add(new View());
f.setVisible(true);
}
@Override
public void tableChanged(TableModelEvent e) {
//update jtable with the model's modification
}
}
【问题讨论】:
-
你的意思是每个 Item 类都有不同数量的你想在 JTable 的列中显示的属性吗?
-
有一堆关于
AbstractTableModel基于util.List的线程,请参阅相关(左下角),其余问题可能是不相关的,没有发布SSCCE,简短,可运行,可编译, -
是的,每个项目都有不同数量的属性,所以我需要为每个项目制作不同的JTable,制作不同的模型
-
@mKorbel 我已经检查了很多并且仍在检查更多,但我没有发现人们根据对象的类型创建不同的 AbstractTableModel ,同时保持泛型工作。顺便说一句,我对模型唯一不了解的是我将如何给他特定的项目(例如 A),而我唯一拥有的是一个通用的 List
-
@Julien Breuil 必须看看 J(X)TreeTable / Netbeans Outline
标签: java swing generics jtable abstracttablemodel