Java 如何将两个Jtable合并为第三个Jtable?
我有两个JTable具有相同的标题名和列数。现在我想在单击merge按钮时创建第三个JTable,其中包含这两个JTable的所有值。请给我任何答案。您需要将两个JTable的TableModels中保存的数据合并,并将它们添加到第三个JTable中保存的第三个TableModel中。如果表结构都是相同的,您可以遍历模型的行,将每一行添加到新的TableModel中Java 如何将两个Jtable合并为第三个Jtable?,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我有两个JTable具有相同的标题名和列数。现在我想在单击merge按钮时创建第三个JTable,其中包含这两个JTable的所有值。请给我任何答案。您需要将两个JTable的TableModels中保存的数据合并,并将它们添加到第三个JTable中保存的第三个TableModel中。如果表结构都是相同的,您可以遍历模型的行,将每一行添加到新的TableModel中 您可以在上阅读JTables和TableModels。您可以创建一个代理模型,允许您向其附加一个或多个表模型 然后,您将重写所需的
您可以在上阅读JTables和TableModels。您可以创建一个代理模型,允许您向其附加一个或多个表模型 然后,您将重写所需的方法,通过代理模型将请求从表传递到其他表 主要问题是在模型之间映射行索引 用示例更新 这是一个非常基本的例子
public class ProxyTableModelTest {
public static void main(String[] args) {
new ProxyTableModelTest();
}
public ProxyTableModelTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final PersonTableModel modelA = new PersonTableModel();
modelA.add(new Person("Guy", "Eichler", getDateOfBirth()));
modelA.add(new Person("Jamie", "Weishaar", getDateOfBirth()));
modelA.add(new Person("Jamie", "Sinkler", getDateOfBirth()));
modelA.add(new Person("Lorrie", "Collelo", getDateOfBirth()));
modelA.add(new Person("Hugh", "Rolls", getDateOfBirth()));
modelA.add(new Person("Tyrone", "Bogen", getDateOfBirth()));
modelA.add(new Person("Jamie", "Vandine", getDateOfBirth()));
modelA.add(new Person("Max", "Flippin", getDateOfBirth()));
modelA.add(new Person("Christian", "Folson", getDateOfBirth()));
modelA.add(new Person("Neil", "Ralphs", getDateOfBirth()));
final PersonTableModel modelB = new PersonTableModel();
modelB.add(new Person("Jamie", "Santillanes", getDateOfBirth()));
modelB.add(new Person("Carmella", "Leverich", getDateOfBirth()));
modelB.add(new Person("Mathew", "Valade", getDateOfBirth()));
modelB.add(new Person("Louisa", "Smead", getDateOfBirth()));
modelB.add(new Person("Nelson", "Vails", getDateOfBirth()));
modelB.add(new Person("Harriett", "Tengan", getDateOfBirth()));
modelB.add(new Person("Liza", "Uhler", getDateOfBirth()));
modelB.add(new Person("Ashlee", "Forbush", getDateOfBirth()));
modelB.add(new Person("Guy", "Kluender", getDateOfBirth()));
modelB.add(new Person("Eve", "Cooter", getDateOfBirth()));
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
JPanel controlsA = new JPanel();
JButton addA = new JButton("Add");
addA.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
modelA.add(new Person("A", "A", getDateOfBirth()));
}
});
controlsA.add(addA);
JPanel controlsB = new JPanel();
JButton addB = new JButton("Add");
addB.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
modelB.add(new Person("B", "B", getDateOfBirth()));
}
});
controlsB.add(addB);
JPanel groupA = new JPanel(new BorderLayout());
groupA.add(new JScrollPane(new JTable(modelA)));
groupA.add(controlsA, BorderLayout.SOUTH);
JPanel groupB = new JPanel(new BorderLayout());
groupB.add(new JScrollPane(new JTable(modelB)));
groupB.add(controlsB, BorderLayout.SOUTH);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridy = 0;
gbc.gridx = 0;
frame.add(groupA, gbc);
gbc.gridx++;
frame.add(groupB, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
frame.add(new JScrollPane(new JTable(new ProxyTableModel(modelA, modelB))), gbc);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ProxyTableModel extends AbstractTableModel implements TableModelListener {
private List<TableModel> models;
private int rowCount;
public ProxyTableModel() {
models = new ArrayList<>(3);
}
public ProxyTableModel(TableModel... models) {
this();
for (TableModel model : models) {
add(model);
}
System.out.println("rowCount = " + rowCount);
}
protected int getRowOffset(TableModel model) {
int rowOffset = 0;
for (TableModel proxy : models) {
if (proxy.equals(model)) {
break;
} else {
rowOffset += proxy.getRowCount();
}
}
return rowOffset;
}
protected TableModel getModelForRow(int row) {
TableModel model = null;
int rowOffset = 0;
for (TableModel proxy : models) {
if (row >= rowOffset && row < (rowOffset + proxy.getRowCount())) {
model = proxy;
break;
}
rowOffset += proxy.getRowCount();
}
return model;
}
protected void updateRowCount() {
rowCount = 0;
for (TableModel proxy : models) {
rowCount += proxy.getRowCount();
}
}
public void add(TableModel model) {
int firstRow = getRowCount();
int lastRow = firstRow + model.getRowCount() - 1;
models.add(model);
model.addTableModelListener(this);
updateRowCount();
fireTableRowsInserted(firstRow, lastRow);
}
public void remove(TableModel model) {
if (models.contains(model)) {
int firstRow = getRowOffset(model);
int lastRow = firstRow + model.getRowCount() - 1;
model.removeTableModelListener(this);
models.remove(model);
updateRowCount();
fireTableRowsDeleted(firstRow, lastRow);
}
}
@Override
public int getRowCount() {
return rowCount;
}
@Override
public int getColumnCount() {
int columnCount = 0;
if (models.size() > 0) {
columnCount = models.get(0).getColumnCount();
}
return columnCount;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
TableModel model = getModelForRow(rowIndex);
if (model == null) {
System.out.println("rowIndex = " + rowIndex);
System.out.println("rowCount = " + rowCount);
TableModel test = getModelForRow(rowIndex);
}
int rowOffset = getRowOffset(model);
rowIndex -= rowOffset;
return model.getValueAt(rowIndex, columnIndex);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
Class clazz = String.class;
if (models.size() > 0) {
clazz = models.get(0).getColumnClass(columnIndex);
}
return clazz;
}
@Override
public String getColumnName(int column) {
String name = null;
if (models.size() > 0) {
name = models.get(0).getColumnName(column);
}
return name;
}
@Override
public void tableChanged(TableModelEvent e) {
int type = e.getType();
if (type == TableModelEvent.INSERT || type == TableModelEvent.DELETE || type == TableModelEvent.UPDATE) {
int firstRow = e.getFirstRow();
int lastRow = e.getLastRow();
TableModel model = getModelForRow(firstRow);
int rowOffset = getRowOffset(model);
firstRow += rowOffset;
lastRow += rowOffset;
updateRowCount();
TableModelEvent proxy = new TableModelEvent(this, firstRow, lastRow, e.getColumn(), type);
fireTableChanged(e);
} else {
updateRowCount();
TableModelEvent proxy = new TableModelEvent(this, e.getFirstRow(), e.getLastRow(), e.getColumn(), type);
fireTableChanged(e);
}
}
}
protected Date getDateOfBirth() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, random(0, 11));
cal.set(Calendar.DATE, random(1, 31));
cal.set(Calendar.YEAR, random(1900, 2012));
return cal.getTime();
}
protected int random(int min, int max) {
return min + ((int) Math.round(Math.random() * (max - min)));
}
public class PersonTableModel extends AbstractTableModel {
private List<Person> people;
public PersonTableModel() {
people = new ArrayList<>(25);
}
public void add(Person person) {
people.add(person);
int index = people.size() - 1;
fireTableRowsInserted(index, index);
}
public void remove(Person person) {
int index = people.indexOf(person);
if (index > -1) {
people.remove(index);
fireTableRowsDeleted(index, index);
}
}
@Override
public int getRowCount() {
return people.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
Person person = people.get(rowIndex);
switch (columnIndex) {
case 0:
value = person.getFirstName();
break;
case 1:
value = person.getLastName();
break;
case 2:
value = person.getDateOfBirth();
}
return value;
}
@Override
public String getColumnName(int column) {
String value = null;
switch (column) {
case 0:
value = "First name";
break;
case 1:
value = "Last name";
break;
case 2:
value = "Date of birth";
}
return value;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
Class value = null;
switch (columnIndex) {
case 0:
case 1:
value = String.class;
break;
case 2:
value = Date.class;
break;
}
return value;
}
}
public class Person {
private String firstName;
private String lastName;
private Date dateOfBirth;
public Person(String firstName, String lastName, Date dateOfBirth) {
this.firstName = firstName;
this.lastName = lastName;
this.dateOfBirth = dateOfBirth;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
}
公共类ProxyTableModelTest{
公共静态void main(字符串[]args){
新的ProxyTableModelTest();
}
公共ProxyTableModelTest(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
最终PersontableModelA=新PersonTableModel();
modelA.add(新人物(“Guy”,“Eichler”,getDateOfBirth());
modelA.add(新人物(“Jamie”,“Weishaar”,getDateOfBirth());
modelA.add(新人物(“Jamie”,“Sinkler”,getDateOfBirth());
modelA.add(newperson(“Lorrie”,“colelo”,getDateOfBirth());
modelA.add(newperson(“Hugh”,“Rolls”,getDateOfBirth());
modelA.add(newperson(“Tyrone”,“Bogen”,getDateOfBirth()));
modelA.add(新人物(“Jamie”,“Vandine”,getDateOfBirth());
modelA.add(新人物(“Max”,“Flippin”,getDateOfBirth());
modelA.add(newperson(“Christian”,“Folson”,getDateOfBirth());
modelA.add(新人物(“尼尔”,“拉尔夫”,getDateOfBirth());
最终PersontableModelB=新PersonTableModel();
模型b.add(新人物(“Jamie”,“Santillanes”,getDateOfBirth());
模型b.add(新人(“Carmella”,“Leverich”,getDateOfBirth());
模型b.add(新人物(“马修”,“瓦尔德”,getDateOfBirth());
模型b.add(新人物(“路易莎”,“斯梅德”,getDateOfBirth());
模型b.add(新人物(“Nelson”,“Vails”,getDateOfBirth());
模型b.add(新人物(“Harriett”,“Tengan”,getDateOfBirth());
模型b.add(新人(“莉莎”,“尤勒”,getDateOfBirth());
模型b.add(新人物(“Ashlee”,“Forbush”,getDateOfBirth());
模型b.add(newperson(“Guy”,“Kluender”,getDateOfBirth()));
模型b.add(newperson(“Eve”,“Cooter”,getDateOfBirth()));
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的GridBagLayout());
JPanel controlsA=新的JPanel();
JButton addA=新JButton(“添加”);
addA.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
modelA.add(新人物(“A”,“A”,getDateOfBirth());
}
});
添加(addA);
JPanel controlsB=新的JPanel();
JButton addB=新JButton(“添加”);
addB.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
模型B.add(新人物(“B”,“B”,getDateOfBirth());
}
});
控制某人添加(addB);
JPanel groupA=newjpanel(newborderlayout());
添加(新的JScrollPane(新的JTable(modelA));
添加(controlsA,BorderLayout.SOUTH);
JPanel groupB=newjpanel(newborderlayout());
添加(新的JScrollPane(新的JTable(modelB));
B组添加(controlsB,BorderLayout.SOUTH);
GridBagConstraints gbc=新的GridBagConstraints();
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=1;
gbc.weighty=1;
gbc.gridy=0;
gbc.gridx=0;
添加框架(A组、gbc组);
gbc.gridx++;
frame.add(B组、gbc组);
gbc.gridx=0;
gbc.gridy++;
gbc.gridwidth=GridBagConstraints.rements;
frame.add(新JScrollPane(新JTable(新ProxyTableModel(modelA,modelB))),gbc;
框架。设置尺寸(400400);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类ProxyTableModel扩展AbstractTableModel实现TableModelListener{
私有列表模型;
私有整数行数;
公共ProxyTableModel(){
模型=新阵列列表(3);
}
公共代理表模型(表模型…模型){
这个();
用于(表格模型:模型){
添加(模型);
}
System.out.println(“rowCount=“+rowCount”);
}
受保护的int getRowOffset(表格模型){
int rowOffset=0;
用于(TableModel代理:模型){
if(代理等于(模型)){
打破