创建JTable行标题

时间:2010-03-31 06:03:15

标签: java swing jtable

我是JTable的新手。我在使用JTable&排名靠前的链接(JPA)。我有两个按钮“添加行”,“Del Row”,我有一些从db显示的记录。当“添加行”被点击一个新记录时,应该将行标题添加到JTable,并按顺序显示自动增量编号到JTable行标题。

在使用“删除行”按钮删除期间,必须删除记录&不是它相应的标题,以便下一行更新到以前的标题&自动增量编号保持不变,始终按顺序排列。

请在这方面帮助我。

提前致谢, Chandu

3 个答案:

答案 0 :(得分:3)

由于您是JTable的新手,我将从How to Use Tables开始。正如那里建议的那样,我会扩展AbstractTableModel,覆盖getValueAt()setValueAt()getRowCount()等。以使用相应的JPA实体和控制器类和方法。例如,NetBeans IDE可以自动生成此类。还有一个功能可以将类绑定到Swing组件,包括JTableJList,但我还没有尝试过。

如果行id是数据库管理的自动增量编号,我不确定是否有一种可靠的方法来维护多用户环境中顺序顺序的外观。如果完全显示该字段,则isCellEditable()可能应该返回该列的false。这是你的意思是行标题吗?

附录:另见What’s the best way get the ID of the item just inserted?

答案 1 :(得分:3)

你的意思是这样吗?

likeThis http://img705.imageshack.us/img705/8920/screenshot7ry.png

添加新记录时,其ID设置为行标题(如记录1,2,3),删除记录时,行标题仍然存在,但信息已经消失(如记录4,5中用于获取数据,但被删除后只留下ID)

IF 这就是你的意思。

您需要做的是创建两个表模型,一个包装另一个。

  • 包装器的唯一功能是显示一个额外的列(id)并保留数据的内部“副本”。

  • 当添加一行时,包装器将获得一个新记录,它将分配一个新的id,然后它将获取所有字段并将值复制到他自己的数据中,然后将其转发到包装表模型。

  • 删除行时,包装器不会删除自己的记录,只会清除(设置为“”)列值并保留id列。然后它会将事件转发到包裹的列,而列实际上会删除该行。

类似于以下非编译-java

 // Wrapper table model   
 class IdTableModel implements TableModelListener {
      TableModel original;

      // Analog to: Object[][]
      List<List<Object> data = new ArrayList<List<Object>();

      // will take a copy of the data in original
      public IdTableModel( TableModel original ) {
          this.original = original;
          // fillData with values from original
         for( int row = 0 ; row < original.getRowCount(); row++ ) {
              List<Object> shadowRow = new ArrayList<Object>();
              shadowRow.add( row ); // the id
              // copy the values from original to this shadow
              for( int column = 0 ; column < original.getColumnCount(); column++ ) {
                  shadowRow.add( original.getValueAt(row,i));
              }
              // add the shadow to the data
              data.add( shadowRow );
          }
          original.addTableModelListener( this );
      }

      // for Object getValueAt( x, y ) get the data from your "data" not from the original

       ....
       //Here's the magic. this wapper will be a listener of the original
       // then this method will be invoked when the original gets more data 
       // or when it is removed.....
       public void tableChanged( TableEvent e )  {
           int row = e.getFirstRow();
           List<Object> shadowRow = data.get( row);
           switch( e.getType() ) {
               case TableEvent.INSERT:
                    if( ( shadowRow =) == null )  {
                        // there wasn't shadow data at that position
                        data.add( ( shadowRow = new ArrayList<Object>()));
                     }
                     // takevalues from original 
                     shadowRow.add( row ); // the id
                     for( int i = 0 ; i < original.getColumnCount();i++ ) {
                          shadowRow.add( original.getValueAt(row,i));
                     }
               break;
               case TableEvent.UPDATE:
                      // similar to insert, but you don't create a new row        
                     // takevalues from original 
                     for( int i = 0 ; i < original.getColumnCount();i++ ) {
                          shadowRow.set( i+1, original.getValueAt(row,i));
                     }
               break;
               case TableEvent.DELETE:
                      // You don't delete your shadow rows, but just clean it up
                     for( int i = 0 ; i < original.getColumnCount();i++ ) {
                          shadowRow.set( i+1, "");
                     }

               break;

       } 


       // forward calls to the original
      public int getColumnCount(){
           return original.getColumnCount()+1;
      }
      public String getColumnName( int columnIndex ) {
          if( columnIndex == 0 ) {
              return "id";
           } else {
               return original.getColumnName( columnIndex -1 );
           }
       }

       // and so on for, isEditable etc. etc

 }

那就是我最初想要的代码。

我们的想法是拥有一个表模型包装器,为您添加虚构的id列并且不删除它,您只需使用它:

  JTable yourTable = new JTable( new IdTableModel( originalTableModel ));

如果我所说的一切都没有意义,请开始阅读:How to use tables

答案 2 :(得分:0)

此页面可能正是您要找的内容:http://www.chka.de/swing/table/row-headers/JTable.html