2014-11-21 4 views
0

Я пытаюсь найти способ обновить свои ячейки прямым вводом. С моей reshearch, все, кажется, говорят, что вы должны использоватьНе удается обновить ячейки из JTable

myJTable.fireTableCellUpdated() 

Althought, он продолжает спрашивать меня бросить myJTable -> Не может быть литыми на AbstractTableModel, который что, от того, что я понял, необходим.

Вот мой текущий код таблицы, если это может поможет:

myJTable= new JTable(); 

    myJTable.setModel(new DefaultTableModel(
     new Object[][] { 
      {null, null, null}, 
     }, 
     new String[] { 
      "Thing#1", "Thing#2", "Thing#3" 
     } 
    )); 

    myJTable.getModel().addTableModelListener(new TableModelListener() { 
     public void tableChanged(TableModelEvent e) { 
      myJTable.fireTableCellUpdated(e.getFirstRow(), e.getColumn()); 
      myJTable.repaint(tblCG.getCellRect(e.getFirstRow(), e.getColumn(), false)); 
      myJTable.putClientProperty("terminatedEditOnFocusLost", true); 
     } 
     }); 

Как это возможно для меня, чтобы сохранить ДАННЫЕ из ячейки, который был обновлен путем прямого ввода от пользователя? Спасибо!

+0

'myJTable.fireTableCellUpdated()' - Нет, никогда! Вы должны просто использовать 'JTable # setValueAt' или' TableModel # setValueAt', и если 'TableModel' настроен правильно, он должен автоматически уведомлять таблицу. Вы никогда не должны вызывать методы пожара событий из контекста класса – MadProgrammer

+0

@MadProgrammer Итак, если я следую вашей логике, я должен сделать следующее: 'myJTable.setValueAt (??? getCellValue ???, e.getFirstRow(), e. getColumn()); ' – MammouthQc

ответ

1

В зависимости от того, что вы пытаетесь сделать, вы можете использовать ...

  • JTable#setValueAt(Object, int, int) или TableModel#setValueAt(Object, int, int) изменять значения строк/столбцов существующих ячеек. Просто будьте осторожны, что модель и представление могут иметь разные индексы, основанные на текущем порядке сортировки и позиции столбцов.
  • Вы можете использовать DefaultTableModel#addRow, чтобы добавить новые строки, и
  • Вы можете использовать DefaultTableModel#removeRow, чтобы удалить их. Просто помните, что значение индекса должно быть в пределах контекста модели, если вы принимаете исходное значение из таблицы/представления, он должен быть преобразован первым в контекст модели ...

Например ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    private JTable myJTable; 

    private String values[] = {"Orange", "Green", "Blue", "Pink", "Yellow"}; 
    private int count; 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       myJTable = new JTable(); 

       myJTable.setModel(new DefaultTableModel(
           new Object[][]{{"Banana", "Yellow"}}, 
           new Object[]{"Fruit", "Color"} 
       )); 

       JButton change = new JButton("Change"); 
       change.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         count++; 
         String value = values[Math.abs(count % values.length)]; 
         myJTable.setValueAt(value, 0, 1); 
        } 

       }); 
       JButton add = new JButton("add"); 
       add.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         DefaultTableModel model = (DefaultTableModel) myJTable.getModel(); 
         model.addRow(new Object[]{"Apple " + model.getRowCount(), "Green"}); 
        } 

       }); 
       JButton delete = new JButton("delete"); 
       delete.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         int rowIndex = myJTable.getSelectedRow(); 
         rowIndex = myJTable.convertRowIndexToModel(rowIndex); 
         if (rowIndex > 0) { 
          DefaultTableModel model = (DefaultTableModel) myJTable.getModel(); 
          model.removeRow(rowIndex); 
         } 
        } 

       }); 

       JPanel actions = new JPanel(); 
       actions.add(change); 
       actions.add(add); 
       actions.add(delete); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(myJTable)); 
       frame.add(actions, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

вы должны только нужно вызвать один из методов событий помощника fireXxx если вы настроили класс себя в некотором роде и должны быть вызваны только из контекста классов, они не должны быть вызваны извне, это ответственность реализации класса, чтобы сделать это

Таким образом, без дополнительного кода ...

Editing

редактирование Cell встроено по умолчанию ...

Смотреть ...

подробнее ...

+0

Спасибо за тэгов! [Вот что я имел в виду] (http://i.imgur.com/oSdFHeI.png?1). Когда я нажимаю на «D3788» в изображение, которое я должен быть в состоянии изменить его на что-то еще ... 'Table.getModel(). AddTableModelListener (новый TableModelListener() { \t \t \t общественного недействительными tableChanged (TableModelEvent е) { \t \t \t \t если (! строительство) { \t \t \t \t Table.setValueAt (Table.getModel(). getValueAt (e.getFirstRow(), e.getColumn()), e.getFirstRow(), е. getColumn()) \t \t \t \t Table.repaint (Table.getCellRect (e.getFirstRow(), e.getColumn(), false)); \t \t \t \t Table.putClientProperty ("terminatedEditOnFocusLost", true); \t \t \t \t} \t \t \t} \t \t \t}); ' – MammouthQc

+0

Извините за плохую видимость, небольшие комментарии. Код - это код таблицы. Строительство является логическим, чтобы быть уверенным, что я не слушаю программные входы. Когда этот код выполняется, я получаю сбой, который выглядит как бесконечный цикл. – MammouthQc

+0

И что он работает? По умолчанию 'TableCellEditor' должен позаботиться об этом автоматически ... – MadProgrammer

0

Вот мое предложение (надеюсь, я понимаю проблему справа):

  1. Я хотел бы объявить поля данных, которые передаются в DefaultListModel как атрибуты класса , Затем вы можете получить доступ к объектам своей таблицы с помощью этих атрибутов.

  2. Я бы переопределил DefaultTableModel#setValueAt(Object, int, int) и DefaultTableModel#getValueAt(int, int) в неявном конструкторе.

Так попробуйте следующее решение:

//declared as class attributes 
Object[][] data = {{null, null, null},}; 
String[] columns = {"Thing#1", "Thing#2", "Thing#3"}; 

/*...*/ 

table.setModel(new DefaultTableModel(data, columns) { 
    @Override 
    public Object getValueAt(int row, int col) { return data[row][col]; } 
    @Override 
    public void setValueAt(Object value, int row, int col) { 
     data[row][col] = value; 
     fireTableCellUpdated(row, col); 
    } 
}); 

надеюсь, что это может помочь ...

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