我现在正在调查JTable并且有一堆业务对象,我使用Hibernate + Spring Data JPA从数据库中检索。
我喜欢Spring Data JPA处理DAL的所有繁琐实现,并且想知道TableModel
是否有类似内容。
基本上,我会有以下几点:
public class GenericTableModel<T> extends AbstractTableModel
GenericTableModel
会使用反射和/或注释来查看T
。
这样的事情存在吗?我希望我不必为每个想要在JTable上显示的对象都有一个TableMode ..
答案 0 :(得分:3)
GenericTableModel将使用反射来查看T。
Bean Table Model执行此操作。
答案 1 :(得分:2)
http://java.net/projects/beansbinding/ 只要你有Bean-Style getter和setter,就可以绑定业务对象来查看组件(包括表)。
答案 2 :(得分:2)
我正在为Swing Developers编写一个库。它正在进行中。但我已经做了你想要的。看看这个包中的类:
有关如何使用此示例的示例,请查看此课程 - 查看行号 - 70-85
http://code.google.com/p/swingobjects/source/browse/SwingObjects/src/test/CompTest.java
我还没有写好文档。但如果你不遵循任何事情,请在这里评论。
更新 - 代码示例
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import org.aesthete.swingobjects.annotations.Column;
import org.aesthete.swingobjects.view.table.RowDataBean;
import org.aesthete.swingobjects.view.table.SwingObjTable;
import org.jdesktop.swingx.JXFrame;
public class TableDemo {
public static void main(String[] args) {
try {
//For this demo the Framework need not be initialised.. If you plan on using the entire framework, then
//its best you initialise it before working on anything...
// SwingObjectsInit.init("/swingobjects.properties", "/error.properties");
//Here's the data to show on the table
final List<Row> rows = new ArrayList<Row>();
rows.add(new Row("Data 1", "Data 2", "Yes", true));
rows.add(new Row("Data 3", "Data 4", "No", false));
//Create the swing table as below.. Provide the Row.class to say that the data in the rows
// will be from this class
final SwingObjTable<Row> table = new SwingObjTable<Row>(Row.class);
table.setData(rows);
table.setVisibleRowCount(4);
//Make any column into a combo box by calling the below method.
//A column can be automatically made into a checkbox, by defining your property in the Row class as a boolean
table.makeColumnsIntoComboBox(new String[] { "Yes", "No" }, 2);
//Initialise the frame and show it on the screen
final JXFrame frame = new JXFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public static class Row extends RowDataBean{
@Column(index=0,name="Column 1",editable=true)
private String column1;
@Column(index=1,name="Column 2",editable=true)
private String column2;
@Column(index=2,name="Column 3",editable=true)
private String column3;
@Column(index=3,name="Column 4",editable=true)
private boolean column4;
public Row(String column1, String column2, String column3, boolean column4) {
super();
this.column1 = column1;
this.column2 = column2;
this.column3 = column3;
this.column4 = column4;
}
public String getColumn1() {
return column1;
}
public void setColumn1(String column1) {
this.column1 = column1;
}
public String getColumn2() {
return column2;
}
public void setColumn2(String column2) {
this.column2 = column2;
}
public String getColumn3() {
return column3;
}
public void setColumn3(String column3) {
this.column3 = column3;
}
public boolean getColumn4() {
return column4;
}
public void setColumn4(boolean column4) {
this.column4 = column4;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((column1 == null) ? 0 : column1.hashCode());
result = prime * result + ((column2 == null) ? 0 : column2.hashCode());
result = prime * result + ((column3 == null) ? 0 : column3.hashCode());
result = prime * result + (column4 ? 1231 : 1237);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Row other = (Row) obj;
if (column1 == null) {
if (other.column1 != null)
return false;
} else if (!column1.equals(other.column1))
return false;
if (column2 == null) {
if (other.column2 != null)
return false;
} else if (!column2.equals(other.column2))
return false;
if (column3 == null) {
if (other.column3 != null)
return false;
} else if (!column3.equals(other.column3))
return false;
if (column4 != other.column4)
return false;
return true;
}
}
}
更新:回答评论中的查询
1)表可以插入任何组件中,对吧? (JPanel,JScrollPane等),
是。该表扩展了JXTable(swingx),它扩展了JTable。所以它可以放在任何组件内。理想情况下,您可以放入JScrollPane。
2)我们控制了列名? (我的应用程序已本地化为多个langs)
谢谢你。当我开始制作框架时,我没有想到本地化。你指出我正确的方向。我能够快速修改框架来实现这一目标。实际上很简单:
使用l10n - 在开始编码之前,请确保使用以下行初始化Swing Objects Framework。如果您不提供区域设置,则将应用默认区域设置。
SwingObjectsInit.init("swingobjects", "application",new Locale("fr", "FR"));
您需要拥有2组属性文件。
1)swingobjects - 这提供了swingobjects框架的默认值。该文件已在我的代码库中提供。只需将文件复制粘贴到类路径位置即可。
2)应用程序 - 您需要在此处输入应用程序的GUI文本/消息。您必须为您需要的每个区域设置创建一个新的应用程序属性文件。
最后,而不是说
@Column(index=0,name="Column 1",editable=true)
private String column1;
你必须使用:
@Column(index=0,key="test.column1",editable=true)
private String column1;
将名称更改为密钥。这将使它读取资源包并搜索属性test.column1而不是您的硬编码列名称。
3)SwingObjTable是否需要hashCode和equals才能实现?
如果完整使用Swing Objects Framework,则需要equals和hashcode。 Swing Objects Framework允许您为模型类中的bean设置GUI元素的数据 - 在MVC中读取。如果bean的值发生了变化,框架会自动更新GUI。为了检查bean的值是否确实发生了变化,需要调用equals方法。因此,您需要覆盖它。你可以让Eclipse为你生成这个。或者,如果你不在框架中使用任何东西,那么只需从那里调用super.equals()。
只需检查/克隆git repo即可访问TableDemo示例..
git clone https://writetosethu@code.google.com/p/swingobjects/