Метод DefaultTableModel getValueAt, генерирующий, казалось бы, случайные результаты - PullRequest
1 голос
/ 01 августа 2011

У меня есть графический интерфейс с JTable, использующим DefaultTableModel.

Эти переменные экземпляра объявлены:

boolean doRun = false;
Class clazz;
Object obyect;
DefaultTableModel model;
ArrayList<String> al = new ArrayList();

Таблица заполняется этим:

public StatusGUI(Object invokerObject) {
    initComponents();
    setLocationRelativeTo(null);
    clazz = invokerObject.getClass();
    obyect = invokerObject;
    String line;
    try {
        Field[] fields = clazz.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            if (!fields[i].isAccessible()) {
                fields[i].setAccessible(true);
            }
            if (("" + fields[i].getType()).equals("class java.lang.String")) {
                line = "String";
            } else {
                line = "" + fields[i].getType();
            }

            //Note: The first string in the Object is the description, which is left empty

            model.insertRow(0, new Object[]{"", fields[i].getName(), line, "" + fields[i]});
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    setVisible(true);
}

Это генерирует (в данном случае) 5 строк, содержащих информацию о переменных.

Я хочу получать и хранить информацию об этих переменных при нажатии кнопки со следующим кодом:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    for (int i = 0; i < model.getRowCount(); i++) {
        String description = "" + model.getValueAt(i, 0);
        System.out.println("Description " + i + ": " + description);
        String name = "" + model.getValueAt(i, 3);
        if (!description.equals("") && description != null) {
            al.add(description + "::" + name);
        }
    }
    if (al.isEmpty()) {
        JOptionPane.showMessageDialog(this, "No descriptions were added to any of the variables."
                + "\nThis could also be because no variables were found - if so, please see 'Help'");
    } else {
        new Thread(new SendThread(al, obyect)).start();
        this.dispose();
    }
}                                        

При добавлении описаний ко всем пяти строкам приведенный выше код генерирует следующий вывод:

Description 0: d1
Description 1: d2
Description 2: d3
Description 3: d4
Description 4: 

Когда только добавляет описание в первую строку JTable, приведенный выше код генерирует:

Description 0: 
Description 1: 
Description 2: 
Description 3: 
Description 4: 

Это показывает, что он распознает все пять строк, но по некоторым причинам портится при чтении из строк.

Я часами смотрю на одни и те же строки кода и, честно говоря, не понимаю, что происходит.

Заранее спасибо, Майк.

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Однако, почему я не могу просто сделать это в конструкторе?

Вы можете установить свойство на столе, чтобы сделать это для вас. См. Таблица остановки редактирования .

3 голосов
/ 01 августа 2011

Мой хрустальный шар говорит, что ваша таблица все еще редактирует (строка 5 в первом примере, строка 0 во втором).Зафиксируйте это изменение первым в выполненном действии.

if (table.isEditing()) {
    table.getCellEditor().stopCellEditing();
}
...