【问题标题】:Create different JTable while keeping generics在保留泛型的同时创建不同的 JTable
【发布时间】: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


【解决方案1】:

TableModel 支持使用Class Literals as Runtime-Type Tokens 的泛型类型。您对getColumnClass()(如下)的实现定义了可用于表列的类型,并定义了对任何非默认renderers and editors 的选择。虽然DefaultTableModel 提供了相当大的便利,但AbstractTableModel 只是稍微困难一点,而且更灵活。作为一个具体的例子,这个EnvTableTest 说明了一个以Map&lt;String, String&gt; 为模型的表格。

@Override
public Class<?> getColumnClass(int columnIndex) {
    // return a token for the specified column
}

【讨论】:

  • 我完全同意这一点,但我认为我没有正确解释我的问题。例如,当我为 A 创建 JTable 时,我将提供 Default 或 AbstractTableModel 但我需要将数据放入此模型中,对吗?但是如果我使用 instanceof() 这假设我之前犯了一个错误,我怎么能只用 A 相同类型的对象填充这些数据?对于其余部分,我已经检查了 EnvTableTest,并且我通过它知道如何制作自定义 ColumnName 等。
  • 哎呀,对不起,我的意思是getColumnClass()。是的,您的 TableModel 可以根据需要公开尽可能多或尽可能少的应用程序数据模型。
  • 嗯,这不是我要搜索的内容,但以后可以提供帮助,谢谢。我认为我的英语不足以解释我的问题,只会制作一个丑陋的代码来获取它应该解除阻止我的项目的不同实例的编号,然后我可以专注于 TableModel 实现,但 EnvTableTest 似乎可以回答所有问题我可以问的问题。
  • 很抱歉有任何沟通不畅。知道JTable 监听它的TableModel 可能会有所帮助,因此更新模型应该更新任何监听视图;如果不是,则表明example 存在错误。您可以使用generic interface 最小化instanceof。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多