Создание заголовка строки JTable

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

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

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

Заранее спасибо, Чанду


person Chandu    schedule 31.03.2010    source источник
comment
Я не понимаю о чем ты. Не могли бы вы привести краткий пример того, что вы хотите - возможно, показать начальное представление, как оно выглядит после нажатия кнопки добавления строки и как оно выглядит после нажатия кнопки del row.   -  person John    schedule 31.03.2010
comment
Что у вас есть на данный момент?   -  person OscarRyz    schedule 16.04.2010


Ответы (3)


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

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

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

person trashgod    schedule 31.03.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 ));

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

person OscarRyz    schedule 16.04.2010
comment
Спасибо Оскар, я постараюсь сделать то же самое. - person Chandu; 19.04.2010
comment
Будут ли эти заголовки строк правильно работать как заголовки? Т.е. они не должны прокручиваться по горизонтали. И рендеринг далеко - я думаю, они должны хотя бы удаленно выглядеть, как заголовки столбцов. Не могли бы вы предоставить способ сделать это? - person Joey; 09.06.2010
comment
@Johannes, да, это возможно. Вы должны взглянуть на свойство rowheader JScrollPane. По умолчанию при использовании JScrollPane с JTable этот заголовок строки пуст, вы можете предоставить собственный компонент. Дополнительная информация здесь: java.sun.com/docs/books/ руководство / uiswing / components / - person OscarRyz; 09.06.2010

Возможно, вы ищете эту страницу: http://www.chka.de/swing/table/row-headers/JTable.html.

person Gili    schedule 06.09.2010