1

我现在正在研究 JTables 并有一堆业务对象,我使用 Hibernate + Spring Data JPA从数据库中检索这些对象。

我喜欢 Spring Data JPA 处理 DAL 的所有繁琐实现,并且想知道是否有类似的TableModel.

基本上,我会有一些类似的东西:

public class GenericTableModel<T> extends AbstractTableModel

并且GenericTableModel会使用反射和/或注释来查看T.

这样的事情存在吗?我希望我不必为要在 JTable 上显示的每个对象都有一个 TableModel ..

4

3 回答 3

3

GenericTableModel 将使用反射来查看 T。

Bean 表模型就是这样做的。

于 2012-02-06T18:54:51.563 回答
2

http://java.net/projects/beansbinding/ 只要您有 Bean 样式的 getter 和 setter,就可以将业务对象绑定到视图组件(包括表)。

于 2012-02-06T00:15:13.043 回答
2

我正在为 Swing 开发人员编写一个库。它正在进行中。但我已经做了你正在寻找的东西。看看这个包中的类:

http://code.google.com/p/swingobjects/source/browse/#git%2FSwingObjects%2Fsrc%2Forg%2Faesthete%2Fswingobjects%2Fview%2Ftable

有关如何使用它的示例,请查看此类-查看行号-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 等)、

是的。该表扩展了扩展 JTable 的 JXTable (swingx)。因此它可以放置在任何组件内。不过,您最好将其放入 JScrollPane 中。

2)我们可以控制列名?(我的应用程序已本地化为多种语言)

谢谢你。当我开始制作框架时,我没有考虑本地化。你为我指明了正确的方向。我能够快速修改框架来实现这一点。其实很简单:

要使用 l10n - 在开始编码之前,请确保使用以下行初始化 Swing 对象框架。如果您不提供区域设置,则将应用默认区域设置。

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 对象框架,则需要 equals 和 hashcode。Swing 对象框架允许您在模型类中的 bean 中为 GUI 元素设置数据 -像 MVC 中一样读取。如果 bean 的值发生了变化,框架会自动更新 GUI。为了检查 bean 的值是否确实发生了变化,它需要调用 equals 方法。因此,您需要覆盖它。你可以让 Eclipse 为你生成这个。或者,如果您不使用框架中的任何内容,则只需从那里调用 super.equals() 。

只需检查/克隆 git 存储库,您就可以访问 TableDemo 示例。

git clone https://writetosethu@code.google.com/p/swingobjects/ 
于 2012-02-06T04:37:40.677 回答