gpt4 book ai didi

java - 在保留泛型的同时创建不同的 JTable

转载 作者:行者123 更新时间:2023-11-29 05:50:10 24 4
gpt4 key购买 nike

我有一个使用 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{}

但现在我需要创建一个 View ,其中包含一些操作按钮(添加、删除、编辑),中间有一个 JTable,显示特定项目(A、B、C)。这是我的第一个问题,因为每个特定项目的其中一个字段都有一列,所以我需要为每个项目使用不同的表格。

一个解决方案可能是为每种类型的项目使用一个表格的卡片布局,但这带来了一个新问题,我的 View 如何在不使用 instanceof()< 的情况下确定模型中有多少类型的项目 ?

此外我还会遇到其他问题,如果我的 View 中有 x jtable,我的 View 将如何获得该表的模型?我可以为每个项目实现一个这样的界面:

public interface MyModel{
AbstractTableModel getModel();
}

但是我只能给这个函数一个列表,那么每个项目如何只用它的项目类型填充数据数组?

PS:如果我在反射(reflection)中走得更远,我有一个额外的问题,我想知道我的操作按钮的监听器如何简单地知道当前正在修改哪个 JTable,我是否应该将监听器放在 View 中以简化访问卡片布局?

如果需要改进我的问题,请提出要求!不确定问题目前是否明确。

编辑:添加 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

}
}

最佳答案

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
}

关于java - 在保留泛型的同时创建不同的 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com