2016-09-03 4 views
0

EDIT: проблема решена. Я случайно положил return внутри оператора if вместо break. Перед тем, как изменить значение DefaultTableModel, функция вышла.Вставка строки в JTable

StockNameArr представляет собой массив всех символов запаса в таблице (которые расположены по алфавиту), расположенных в алфавитном порядке.

Этот класс представляет собой JTable с двумя столбцами, которые можно щелкнуть. Первый столбец печатает только stdout, и это отлично работает. Вторая удаляет строку, в которой она находится, и упорядочивает имя каждого запаса в алфавитном порядке в JComboBox. Насколько я знаю, это работает правильно.

Когда один из элементов в JComboBox щелкают, он должен удалить элемент, создать String[8] (сопоставляя другие столбцы 8 строк), вставьте имя запаса из пункта, который кликнул, и вставить массив как строка в том же месте, в котором она была ранее удалена.

Однако на самом деле этот элемент удален из JComboBox, в то время как новая строка никогда не вставлена ​​в таблицу. Я пробовал позвонить:

model.insertItemAt(...); 
thisTable.setModel(model); 

Но это ничего не делало. Думаю, что, возможно, model или thisTable были настроены правильно, я ссылался на thisTable на это как переменную класса и попытался вставить строку в TableModel, даже создав для нее новую переменную во внутреннем классе. Тем не менее, не повезло.

Может ли кто-нибудь мне помочь?

import java.awt.event.Action/Event; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Collections; 

import javax.swing.JComboBox; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

public class JMainTable extends JTable { 
    JMainTable thisTable = this; //Represents this class in inner classes 
    final String[] stockNames; 
    DefaultTableModel model; 
    JComboBox<String> dropdown; 
    ArrayList<String> dropdownStocks = new ArrayList<String>(); 
    int rowChangeOffset = 0; 
    public JMainTable(DefaultTableModel tableModel, String[] stockNameArr, JComboBox<String> combobox) { 
     super(tableModel); 
//  thisTable = this; 
     stockNames = stockNameArr; 
     addMouseListener(new mainTableListener()); 
     model = tableModel; 

     dropdown = combobox; 
     dropdown.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 
     //^ prevents ActionListener from firing when scrolling through list with arrow keys 

      dropdown.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        if (!e.getActionCommand().equals(ActionEvent.KEY_EVENT_MASK)){ 
         System.out.println("Clicked"); 
         JComboBox<String> source = (JComboBox<String>) e.getSource(); 
         String stockString = (String) source.getSelectedItem(); 
         int index = dropdownStocks.indexOf(stockString); 
         try { 
          source.removeItemAt(index); 
          dropdownStocks.remove(index); 
         } catch(ArrayIndexOutOfBoundsException arrEx) {} 
         int indexInStockNames = 0; //for compiler 
         for(int i = 0; i<stockNames.length; i++) { 
          if(stockNames[i].equals(stockString)) { 
           indexInStockNames = i; 
           return; 
          }//end of If 
         }//End of For 
        String[] replacementRow = new String[8]; 
        replacementRow[0] = stockString; 
        //model.insertRow(indexInStockNames, replaceRow); 
        ((DefaultTableModel) thisTable.getModel()).insertRow(indexInStockNames, replacementRow); 
        if(index>=0) {//Prevents offset from being changed 
            //when user clicks on empty JComboBox 
         rowChangeOffset--; 
        } 

        } 
       } 
      }); 
    } 

    class mainTableListener extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent mouseevent) { 
      int column; 
      if((column = thisTable.getSelectedColumn()) == 6) { 
       int row = thisTable.getSelectedRow(); 
       System.out.println("Button for " + stockNames[row + rowChangeOffset] + " working.");//TESTING 
       //NOIMPLEMEN 
      } else if((column = thisTable.getSelectedColumn()) == 7) { 
       int row = thisTable.getSelectedRow(); 
       model.removeRow(row); 
       try{ 
       dropdownStocks.add(stockNames[row + rowChangeOffset]); 
       } catch(Exception adsf) {adsf.printStackTrace(); System.out.println(stockNames[row+rowChangeOffset]);} 
       int index; 
       try { 
        Collections.sort(dropdownStocks); 
        index = dropdownStocks.indexOf(stockNames[row+rowChangeOffset]); 
       } catch(Exception ex) {/*dropdownStocks may be empty*/ 
        index=0; 
       } 

       dropdown.insertItemAt(stockNames[row+rowChangeOffset], index); 
       rowChangeOffset = rowChangeOffset + 1; 
      } 
     } 
    } 
} 
+0

Вы не отправил жизнеспособный [mcve] все же, код, который короток, что компилирует и работает для нас без изменений, и это демонстрирует вашу проблему, и это создает проблему для нашей способности понять вашу проблему и ваш код и тем самым помочь вам. Подумайте о том, чтобы приложить усилия к созданию одного из этих зверей, а затем опубликовать его здесь в виде текста с отформатированным кодом (не по ссылке). –

+0

Обратите внимание, что это * никогда * код: 'catch (ArrayIndexOutOfBoundsException arrEx) {}', это код, который никогда не должен быть в вашей программе. Почему вы чувствуете необходимость включить его? Кроме того, и снова, пожалуйста, улучшите свою программу, если вам все еще нужна помощь. –

ответ

1

попробовать это, это поможет добавить строку в вашей модели, которая связана с вашим столом

model.addRow(new Object[]{objec1,object2}); //param to count of columns to table 
jTable1.setModel(modelo); 
/*You are not required if in the beginning did something like this 
modelo = (DefaultTableModel)jTable1.getModel();*/ 
+1

Пожалуйста, объясните, почему вы думаете, что ваш ответ поможет OP (оригинальный плакат) и как он улучшится в его текущем размещенном коде. –

+0

Принято, потому что это сработало бы, если бы я правильно ввел код. – user2465510

Смежные вопросы