Создавайте разные JTable, сохраняя дженерики

У меня есть рабочая программа, использующая 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

    }
}

person Julien Breuil    schedule 08.01.2013    source источник
comment
Вы имеете в виду, что каждый класс Item будет иметь разное количество атрибутов, которые вы хотели бы показать в столбцах JTable?   -  person Randy    schedule 08.01.2013
comment
есть куча веток о AbstractTableModel на основе util.List, см. Связанные (слева внизу), остальная часть вопроса может быть не связанной, без публикации SSCCE, короткий, исполняемый, компилируемый,   -  person mKorbel    schedule 08.01.2013
comment
да, каждый элемент имеет разное количество атрибутов, поэтому мне нужно сделать разные JTable для каждого из них, создав также другую модель   -  person Julien Breuil    schedule 08.01.2013
comment
@mKorbel Я проверил многие из них и все еще проверяю еще, но я не нахожу людей, создающих разные модели AbstractTableModel в зависимости от типа объекта, сохраняя при этом работу дженериков. Кстати, единственное, что я не понимаю в модели, это то, как я смогу дать ему конкретный элемент (например, A), в то время как единственное, что у меня есть, это список‹Элемент›, который является общим   -  person Julien Breuil    schedule 08.01.2013
comment
@mKorbel только что прочитал все их ответы, я понимаю суть ModelListener, но на самом деле это не было проблемой, которая меня блокировала. Я просто не понимаю, что я могу поместить в свой SSCCE, потому что я просто не знаю, как компилировать мою идею на самом деле, потому что я не хочу использовать instanceof(), так как я думаю, что это будет неправильное понимание реальной проблемы, я могу попробовать опубликовать что-нибудь, но это будет попытка реализации, и она не будет работать так, как я хочу. . . (иди работай над этим)   -  person Julien Breuil    schedule 08.01.2013
comment
У вас есть список, который может содержать только A, только B или только C? Или у вас есть список, который может содержать экземпляры A, B и C одновременно?   -  person JB Nizet    schedule 08.01.2013
comment
@JB Nizet Я не должен знать, сколько типов элементов существует, поэтому я не знаю, как создать функцию, которая составляет отдельный список, как вы сказали. Но да, единственное, что у меня есть, это список, который содержит элементы, поэтому он может содержать A, B, C или w/e одновременно.   -  person Julien Breuil    schedule 08.01.2013
comment
Итак, вы имеете в виду, что могут быть и другие подклассы, и таблица должна динамически отображать дополнительные атрибуты, которые могут существовать в этих подклассах?   -  person JB Nizet    schedule 09.01.2013
comment
@JB Nizet Да, таблица проверяет, сколько разных подклассов есть в моей коллекции, и я должен подсчитать их, чтобы создать JTable на вкладке для каждого подкласса. В настоящее время я делаю что-то вроде: for(Item i : mp.keySet()){ Object o = i.getClass(); if(!listType.contains(o)){ listType.add(o); } } но я думаю, что это уродливое и не очень хорошее программирование   -  person Julien Breuil    schedule 09.01.2013
comment
@Julien Breuil должен посмотреть J(X)TreeTable/Netbeans Outline   -  person mKorbel    schedule 09.01.2013
comment
@mKorbel кажется действительно отличным, я еще не знаю, как я буду его использовать, но он предлагает много возможностей, ты.   -  person Julien Breuil    schedule 09.01.2013


Ответы (1)


TableModel поддерживает универсальные типы, используя литералы классов в качестве токенов типа времени выполнения< /эм>. Ваша реализация getColumnClass() (ниже) определяет типы, доступные для столбцов таблицы, и определяет выбор любых нестандартных модули визуализации и редакторы. В то время как DefaultTableModel предлагает значительное удобство, AbstractTableModel лишь немного сложнее и значительно более гибок. В качестве конкретного примера этот EnvTableTest иллюстрирует таблицу, смоделированную на основе Map<String, String>.

@Override
public Class<?> getColumnClass(int columnIndex) {
    // return a token for the specified column
}
person trashgod    schedule 08.01.2013
comment
Я полностью согласен с этим, но я думаю, что неправильно объяснил свою проблему. Например, когда я создам свой JTable для A, я дам Default или AbstractTableModel, но мне нужно правильно поместить данные в эту модель? но как я могу заполнить эти данные только объектом того же типа, что и A, если я использую instanceof(), это предполагает, что я сделал ошибку раньше нет? В остальном я уже проверил EnvTableTest, и я знаю, как создать собственное имя столбца и т. Д. - person Julien Breuil; 08.01.2013
comment
К сожалению, извините за это, я имел в виду getColumnClass(). Да, ваш TableModel может предоставлять столько модели данных вашего приложения, сколько необходимо. - person trashgod; 08.01.2013
comment
Ну, это было не то, что я искал, но это может помочь позже, спасибо. Я думаю, что моего английского недостаточно, чтобы объяснить мою проблему, просто сделаю уродливый код, чтобы получить номер другого экземпляра элемента, который должен разблокировать меня, тогда я мог бы сосредоточиться на реализации TableModel, но EnvTableTest, похоже, отвечает на все вопросы. вопрос, который я мог бы иметь. - person Julien Breuil; 08.01.2013
comment
Извините за любое недопонимание. Может помочь знание того, что JTable слушает свое TableModel, поэтому обновление модели должно обновлять любое прослушивающее представление; если нет, это предполагает ошибку, например . Вы можете минимизировать instanceof, используя общий интерфейс. - person trashgod; 09.01.2013