1

我有一个使用ModelItem.

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

    }
}
4

1 回答 1

3

TableModel支持使用Class Literals 作为 Runtime-Type Tokens 的泛型类型。您的getColumnClass()(如下)实现定义了表格列可用的类型,并定义了任何非默认渲染器和编辑器的选择。虽然DefaultTableModel提供了相当大的便利,AbstractTableModel但只是稍微困难一点,而且更加灵活。作为一个具体示例,这EnvTableTest说明了一个以Map<String, String>.

@Override
public Class<?> getColumnClass(int columnIndex) {
    // return a token for the specified column
}
于 2013-01-08T19:25:58.767 回答