我有一个使用由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{}
但现在我需要在中心创建一个带有一些动作按钮(添加,删除,编辑)的视图,显示特定项目(A,B,C)。 这是我的第一个问题,因为每个特定项目的一个字段都有一列,所以我需要为每个项目使用不同的表格。
解决方案可能是为每种类型的项目设置一个带有一个表格的卡布局,但是如果不使用instanceof()
我的视图如何确定模型中有多少种类型的项目? / p>
此外,在此之后我会遇到其他问题,如果我在我的视图中有x jtable,我的视图将如何获得此表的模型?我可以为每个项目实现这样的界面:
public interface MyModel{
AbstractTableModel getModel();
}
但我只能给这个函数一个List,那么每个项目如何只用其类型的项填充数据数组?
PS:如果我在我的反思中更进一步,我有一个红利问题,我想知道我的动作按钮的监听器如何能够简单地知道哪个JTable当前正在被修改,我是否应该将监听器放在视图中以简化访问cardlayout?如果需要改进我的问题,请求它!不确定问题目前是否清楚。
编辑:添加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
}
}
答案 0 :(得分:3)
TableModel
使用Class Literals as Runtime-Type Tokens支持通用类型。您对getColumnClass()
(下面)的实现定义了表的列可用的类型,并定义了任何非默认renderers and editors的选择。虽然DefaultTableModel
提供了相当大的便利,但AbstractTableModel
只是稍微困难一些,而且更加灵活。作为一个具体示例,此EnvTableTest
说明了以Map<String, String>
建模的表格。
@Override
public Class<?> getColumnClass(int columnIndex) {
// return a token for the specified column
}