Обновление ячеек JTable не работает

В моем приложении я использую таблицу java, которая похожа на это пример. Моя проблема в том, что когда я меняю значение ячейки (даже в приведенном выше примере), модель данных не обновляется, пока я не нажму на другую ячейку. Даже если я нажимаю на серую область под таблицей после изменения значения ячейки, модель не изменится. Я думаю, причина в том, что ячейка остается сфокусированной, пока я не нажму на другую ячейку. Как этого избежать и обновить модель, не нажимая на ячейку таблицы. Заранее благодарим

Я отредактировал приведенный выше пример кода, чтобы отразить проблему

public class JTableDemo extends JApplet {
  private JTextArea txt = new JTextArea(4, 20);

  // The TableModel controls all the data:
  class DataModel extends AbstractTableModel {
    Object[][] data = { { "one", "two", "three", "four" },
        { "five", "six", "seven", "eight" },
        { "nine", "ten", "eleven", "twelve" }, };

    // Prints data when table changes:
    class TML implements TableModelListener {
      public void tableChanged(TableModelEvent e) {
        txt.setText(""); // Clear it
        for (int i = 0; i < data.length; i++) {
          for (int j = 0; j < data[0].length; j++)
            txt.append(data[i][j] + " ");
          txt.append("\n");
        }
      }
    }

    public DataModel() {
      addTableModelListener(new TML());
       fireTableDataChanged();
    }

    public int getColumnCount() {
      return data[0].length;
    }

    public int getRowCount() {
      return data.length;
    }

    public Object getValueAt(int row, int col) {
      return data[row][col];
    }

    public void setValueAt(Object val, int row, int col) {
      data[row][col] = val;
      System.out.println(val);
      // Indicate the change has happened:
      fireTableDataChanged();
    }

    public boolean isCellEditable(int row, int col) {
      return true;
    }
  }

  public void init() {
    Container cp = getContentPane();
    JTable table = new JTable(new DataModel());
    cp.add(new JScrollPane(table));
    cp.add(BorderLayout.SOUTH, txt);
  }

  public static void main(String[] args) {
    run(new JTableDemo(), 350, 200);
  }

  public static void run(JApplet applet, int width, int height) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(applet);
    frame.setSize(width, height);
    applet.init();
    applet.start();
    frame.setVisible(true);
  }
}

Когда вы запускаете пример, вы можете видеть содержимое таблицы в текстовой области под таблицей. После обновления ячейки она должна появиться в текстовом поле ниже. Но метод setValueAt не будет вызывать, пока вы не нажмете на другую ячейку.

8
задан nath 31 October 2011 в 09:00
поделиться