【发布时间】:2013-12-19 01:50:24
【问题描述】:
我要做什么:
我想要两个并排的 JTable,当您在左侧的 JTable 中进行选择时,您会在右侧的 JTable 中看到有关该行的更多详细信息。
我的问题是什么?:
我不知道如何实现这一点。我曾尝试使用 addListSelectionListener,但我不确定如何使用一个表中的侦听器与完全不同的表进行交互。例如,让侦听器将 table2 替换为具有全新数据的新表。
我已经包含了一个 SSCCE,它显示了我所做的事情的要点。我将不胜感激任何帮助,因为我一直在互联网上搜索试图将这个问题拼凑起来。
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
public class TableInteraction extends JPanel
{
private JTable table1;
private JTable table2;
public TableInteraction()
{
super();
String[][] tableOneData = {{"Kathy", "Smith"}};
String[][] tableTwoData = {{"Kathy", "Smith"}};
String[][] tableThreeData = {{"Matt", "Bird"}};
setLayout(new BorderLayout());
FirstTableModel model1 = new FirstTableModel(tableOneData);
table1 = new JTable(model1);
table1.setPreferredScrollableViewportSize(new Dimension(500,200));
table1.setFillsViewportHeight(true);
table1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table1.setRowSelectionInterval(0,0);
JScrollPane scrollPane1 = new JScrollPane(table1);
SecondTableModel model2 = new SecondTableModel(tableTwoData);
table2 = new JTable(model2);
table2.setPreferredScrollableViewportSize(new Dimension(500,200));
table2.setFillsViewportHeight(true);
table2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane2 = new JScrollPane(table2);
table1.getSelectionModel().addListSelectionListener(
new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent event)
{
int index = table1.getSelectedRow();
}
});
add(scrollPane1, BorderLayout.WEST);
add(scrollPane2, BorderLayout.EAST);
}
public class FirstTableModel extends AbstractTableModel
{
private String[] columnNames = {"First Name", "Last Name"};
private String[][] data;
public FirstTableModel(String[][] data)
{
this.data = data;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
}
public class SecondTableModel extends AbstractTableModel
{
private String[] columnNames = {"First Name", "Last Name"};
private String[][] data;
public SecondTableModel(String[][] data)
{
this.data = data;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("TableFilterDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableInteraction newContentPane = new TableInteraction();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
【问题讨论】:
-
"interact" 是什么意思?你想发生什么?
-
在您的代码中,我并没有真正看到创建自定义 TableModel 的意义。使用 DefaultTableModel,它会提供比您的 TableModels 更多的选项。您可以执行 removeRow、removeColumn 之类的操作。因此,从一个表中触发了一个事件,您可以在另一个表模型上执行某些操作。
-
对不起,我太含糊了。我稍微编辑了我的代码,以更好地传达我想要做的事情。我为第一个表设置了一个侦听器,在该侦听器中,我希望它能够完全重新制作第二个表并替换它。我会考虑将它们更改为默认值,我正在遵循一个示例,并认为将其保留为自定义可能会更好。
-
DefaultTableModel 有更多方法可以用来操作表格。