У меня есть рабочая программа, использующая 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
}
}
AbstractTableModel
на основеutil.List
, см. Связанные (слева внизу), остальная часть вопроса может быть не связанной, без публикации SSCCE, короткий, исполняемый, компилируемый, - person mKorbel   schedule 08.01.2013for(Item i : mp.keySet()){ Object o = i.getClass(); if(!listType.contains(o)){ listType.add(o); } }
но я думаю, что это уродливое и не очень хорошее программирование - person Julien Breuil   schedule 09.01.2013