如何在JTable中显示“Click”对象?
ArrayList<Click> myClicks = new ArrayList<Click>();
Click click = new Click(620, 1028);
Click click2 = new Click(480, 230);
myClicks.add(click);
myClicks.add(click2);
看起来应该是这样的:
|---Mouse X---|---Mouse Y---|
| 620 | 1028 |
| 480 | 230 |
真的......
| |
v v
click.getX() click.getY()
click2.getX() click2.getY()
我不想使用2D Object [] [],因为将它们作为Click对象保留得更有意义。
我知道我可能需要扩展TableModel接口,但我不确定如何。
我想请一个快速简单的例子(java文档有点令人困惑)。
答案 0 :(得分:7)
您可以使用DefaultTableModel
,但在您的情况下,这意味着您需要转换数据以确认其需求,更好地定义支持您数据模型的模型......这就是重点< / p>
以下示例使用AbstractTableModel
,因为它可以控制后备数据,但会负责管理大部分内容(注册和触发事件)。
这个例子不可变。也就是说,您无法添加或删除新点击或更改现有点击。这并不困难,您应该通过How to use tables阅读更多详细信息
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
public class ClickTable {
public static void main(String[] args) {
new ClickTable();
}
public ClickTable() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
List<Click> clicks = new ArrayList<>(25);
clicks.add(new Click(620, 1028));
clicks.add(new Click(480, 230));
ClickTableModel model = new ClickTableModel(clicks);
JTable table = new JTable(model);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class Click {
private int x;
private int y;
public Click(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
public class ClickTableModel extends AbstractTableModel {
private List<Click> clicks;
public ClickTableModel(List<Click> clicks) {
this.clicks = new ArrayList<>(clicks);
}
@Override
public int getRowCount() {
return clicks.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int column) {
String name = "??";
switch (column) {
case 0:
name = "Mouse X";
break;
case 1:
name = "Mouse Y";
break;
}
return name;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
Class type = String.class;
switch (columnIndex) {
case 0:
case 1:
type = Integer.class;
break;
}
return type;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Click click = clicks.get(rowIndex);
Object value = null;
switch (columnIndex) {
case 0:
value = click.getX();
break;
case 1:
value = click.getY();
break;
}
return value;
}
}
}
答案 1 :(得分:1)
将它们保持为Click对象更有意义。
当您想要在表格中显示其他自定义对象时,可能还会出现其他情况。 Row Table Model为对象的ArrayList提供了通用支持。它为添加和删除等动态功能提供支持。
JButtonTableModel.java
给出了实现Object完整模型所需代码的示例。