Создание заголовка строки JTable - PullRequest
0 голосов
/ 31 марта 2010

Я новичок в JTable. Я работаю в Swings, используя JTable & Toplink (JPA). У меня есть две кнопки «Добавить строку», «Del Row», и у меня есть несколько записей, отображаемых из базы данных. когда при нажатии «Добавить строку» создается новая запись, заголовок строки должен добавляться в JTable с номером автоматического приращения, отображаемым в последовательном порядке в заголовке строки JTable.

При удалении с помощью кнопки «Удалить строку» необходимо удалить запись, а не соответствующий ей заголовок, чтобы последующие строки были обновлены до предыдущих заголовков, а номер автоматического приращения оставался неизменным и всегда был в последовательности.

Пожалуйста, помогите мне в этом отношении.

Заранее спасибо, Chandu

Ответы [ 3 ]

3 голосов
/ 16 апреля 2010

Вы имеете в виду, как это?

как этот http://img705.imageshack.us/img705/8920/screenshot7ry.png

Когда добавляется новая запись, ее идентификатор устанавливается как заголовок строки (как в записях, 1, 2, 3), а когда запись удаляется, заголовок строки остается, но информация исчезла (как в записях 4,5, которые используют для получения данных, но после удаления оставляют только идентификатор)

ЕСЛИ это то, что вы имеете в виду.

Что вам нужно сделать, так это создать две настольные модели, одну обернуть другой.

  • Единственной функцией оболочки будет показ дополнительного столбца (идентификатора) и сохранение внутренней «копии» данных.

  • При добавлении строки оболочка получит новую запись, назначит новый идентификатор, затем возьмет все поля и скопирует значение в свои данные, а затем перенаправит его в упакованный файл. настольная модель.

  • При удалении строки оболочка не удалит свою собственную запись, она только очистит (установит «») значения столбца и сохранит столбец 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 ));

Если ничего из того, что я сказал, не имеет смысла для вас, начните читать это: Как использовать таблицы

3 голосов
/ 31 марта 2010

Поскольку вы новичок в JTable, я бы начал с Как использовать таблицы . Как и предлагалось, я бы расширил AbstractTableModel, переопределяя getValueAt(), setValueAt(), getRowCount(), и т. Д. , чтобы использовать соответствующие сущность JPA, а также классы и методы контроллера. , Например, среда IDE NetBeans может генерировать такие классы автоматически. Существует также функция привязки классов к компонентам Swing, включая JTable и JList, но я не пробовал.

Если идентификатор строки - это число с автоматическим приращением, управляемое базой данных, я не уверен, что существует надежный способ поддерживать вид последовательного порядка в многопользовательской среде. Если поле отображается вообще, isCellEditable() должно возвращать false для этого столбца. Это то, что вы подразумеваете под заголовком строки?

Приложение: См. Также Как лучше всего получить идентификатор только что вставленного элемента?

0 голосов
/ 06 сентября 2010

Эта страница может быть тем, что вы ищете: http://www.chka.de/swing/table/row-headers/JTable.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...