Наилучший алгоритм для копирования выбранных строк Swing JTable

#java #swing #jython-2.7

#java #swing #jython-2.7

Вопрос:

Я пытаюсь скопировать выбранные строки Swing JTable, используя Jython. Событие копирования происходит по щелчку мыши, поэтому отправной точкой являются выбранные строки, а конечная цель — скопировать их под ними.
Я пытался, но я придумал «чрезвычайно» обременительный алгоритм, который делает не совсем то, что я хочу (скопируйте выбранные, а не ниже …!)

 def copySelectedLine(self, e):
   model = self.table.getModel()
   dataVector = model.getDataVector()
   rowsToCopy = self.table.getSelectedRows()
   for adder, r in enumerate(rowsToCopy):
      r = r adder
      newDataVector = dataVector[:r]   [([model.getValueAt(r, c) for c in xrange(3)]   [
         '', '', '', '', '', ''])]   dataVector[r:] # personal concatenation
      model.setRowCount(0)
      for nr in newDataVector:
         model.addRow(nr)
  

Я принимаю предложение также на Java.

Заранее спасибо!

Комментарии:

1. То есть вы имеете в виду, что у вас есть что-то вроде строк A, B, C, D, и если A и C копируются, вы тогда хотите A, A’, B, C, C’, D?

2. Точно, @Thomas!!

3. Вы уже выполнили свой код с помощью отладчика? Если нет, я предлагаю вам сделать это. Кстати, я не разработчик Python, и я не знаю Jython, поэтому я не могу прокомментировать ваш код, но разве отступы не описывают блоки? Таким образом, ваш код выглядит так, как будто он использует циклы для построения новой модели и сброса модели. Это может быть проблемой с вашим кодом. Также я не знаю, будет ли setRowCount(0) на самом деле усекать полученный вами вектор данных (и удалять строки thw), поэтому вам может потребоваться сделать копию существующих строк перед вызовом этого метода.

4. @Thomas решен…

Ответ №1:

Простота — это самое сложное. Massimiliano Allegri

 def copySelectedLine(self, e):
   model = self.table.getModel()
   rowsToCopy = self.table.getSelectedRows()
   for adder, r in enumerate(rowsToCopy):
      i = r adder 1
      model.insertRow(i, [model.getValueAt(r, c) for c in xrange(3)])
  

PS: Странно, что я ответил первым…