2010-09-02 2 views
1

Как указано в заголовке, у меня есть JTable, и я не могу редактировать «произвольные» столбцы. У меня есть 4 столбца, и только первый столбец доступен для редактирования. В первом столбце есть файлы и специальный редактор, в следующих двух столбцах есть строки, а в последнем столбце есть целые числа. Я использую пользовательскую модель, и я возвращаю true из метода isCellEditable. Конечно, сначала я обратился за помощью к нескольким веб-сайтам, но я не смог найти ничего, что помогло бы. Я использовал исходный код java для переопределения нескольких методов JTable и вставки операторов печати. В частности, я обнаружил, что table.editCellAt (строка, col) всегда возвращает false, поскольку компонент редактирования, возвращаемый из редактора ячейки, всегда равен нулю. Поэтому я, естественно, попытался заменить редактор, используя table.setDefaultEditor(String.class, new MyEditor()). Как это ни странно, это DID NOT работа. Все редакторы столбцов String по-прежнему были GenericEditor, которые JTable использует по умолчанию. Затем я попытался добавить редактор каждый столбец, выполнив следующие действия:Невозможно редактировать кажущиеся произвольными столбцы JTable

TableColumnModel model = table.getColumnModel(); 
for(int i = 1; i < model.getColumnCount(); i++){ 
    model.getColumn(i).setCellEditor(new MyEditor()); 
} 

Обратите внимание, что я начинается на 1, потому что первый столбец уже имеет соответствующий редактор. У меня нет идей в этот момент, поэтому я пришел к хорошим людям в Stack Overflow для некоторой помощи.

Edit: Я использую DefaultTableModel, я просто отменяют isCellEditable, чтобы убедиться, что он всегда возвращает истину (хотя и DefaultTableModel предполагается сделать это будет по умолчанию). Я сделал это, чтобы уменьшить количество бесполезных, расточительных отладочных ответов. Кроме того, тот факт, что один столбец доступен для редактирования, но другие, похоже, не указывают на то, что проблема находится в другом месте.

Редактировать: Похоже, проблема осталась с созданием столбцов. Профессор предложил изменить setAutoCreateColumnsFromModel и, похоже, исправил проблему.

+1

У вас есть собственный код, и он не работает? Ну вот, где я начну. Сначала получите код, работающий с использованием классов, которые поставляются с JDK. Для этого используйте DefaultTableModel. Затем, как только вы доказали, что это работает, вы делаете одно изменение за раз с вашим пользовательским кодом. Когда он перестает работать, вы знаете, где проблема, и вы можете опубликовать свой SSCCE (http://sscce.org), показывая проблему. – camickr

+0

@gerenba: Я перенес вашу дополнительную информацию на вопрос. Пожалуйста, верните, если это неверно. – trashgod

+0

Учебник Swing имеет простой пример использования DefaultTableModel, который может быть хорошим основанием SSCCE. http://download.oracle.com/javase/tutorial/uiswing/components/table.html – trashgod

ответ

0

Я использую DefaultTableModel, я просто переопределяю isCellEditable, чтобы убедиться, что он всегда возвращает true (даже если DefaultTableModel должен делать это по умолчанию). Я сделал это, чтобы уменьшить количество бесполезных, расточительных отладочных ответов. Кроме того, тот факт, что один столбец доступен для редактирования, но другие, похоже, не указывают на то, что проблема находится в другом месте.

+0

@Brett Geren, @gerenba: Я перенаправил вашу дополнительную информацию на вопрос, чтобы вы могли удалить это. Пожалуйста, используйте одно удостоверение на сайте. – trashgod

1

Для проверки использования JTable требуется только 5 строк «пользовательского кода». Остальная часть кода является шаблоном для любого SSCCE, который вы могли бы создать в будущем.

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
     DefaultTableModel model = new DefaultTableModel(5, 3); 
     JTable table = new JTable(model); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Basic SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
0

Похоже, что проблема осталась при создании столбцов. Профессор предложил изменить setAutoCreateColumnsFromModel и, похоже, исправил проблему.

+0

@Brett Geren, @gerenba: Я перенес вашу дополнительную информацию на вопрос, поэтому вы можете удалить это. Пожалуйста, используйте одно удостоверение на сайте. – trashgod

+0

Правильно, и как мы можем предположить, что вы используете этот метод, поскольку ни один из примеров в учебнике Swing не использует этот метод. Вот почему вы должны публиковать SSCCE с каждым вопросом. – camickr

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