2012-04-26 4 views
1

TableModelListener определяет интерфейс для объекта, который прослушивает изменений в TableModel.setModel на JTable при изменении DefaultTableModel

TableModelListener

Как применить это к JTable, так что он будет прослушивать изменения в DefaultTableModel? Кроме того, после вызова setModel, не следует ли встроить эту функциональность? Почему вы не хотите, чтобы JTable отражал изменения модели?

Ссылка на defaultTableModel в новостях указывает на тот же экземпляр, что и в MessagesController (это правильно?), Так почему я должен явно вызывать setModel в JTable, если базовый объект был обновлен?

Что может улучшить JTable для самосовершенствования? Возможно tableChanged?

Не понимаю, если и ссылка в новостях и ссылка в MessagesController указывают на разные объекты с теми же значениями, почему необходимо вызвать setModel(). В конце концов, News.defaultTableModel теперь обновлен. Зачем повторно ссылаться на setModel()?

package net.bounceme.dur.nntp; 

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.Toolkit; 
import java.util.logging.Logger; 
import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import javax.swing.table.DefaultTableModel; 

public class News { 

    private static final Logger LOG = Logger.getLogger(News.class.getName()); 
    static JFrame frame = new JFrame(); 
    static JTextPane text = new JTextPane(); 
    static JSlider slider = new JSlider(); 
    static MessagesController messagesController = new MessagesController(); 
    static DefaultTableModel defaultTableModel = new DefaultTableModel(); 
    static JTable table = new JTable(); 

    private static void createAndShowGUI() { 
     defaultTableModel = messagesController.getDefaultTableModel(); 
     table.setModel(defaultTableModel); 
     table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 

      public void valueChanged(ListSelectionEvent evt) { 
       java.awt.EventQueue.invokeLater(new Runnable() { 

        public void run() { 
         int row = table.convertRowIndexToModel(table.getSelectedRow()); 
         row = Math.abs(row); //how can this be negative? 
         LOG.fine("row " + row); 
         MessageBean messageBean = messagesController.getMessageBean(row); 
         text.setText(messageBean.getContent()); 
         text.setContentType("text/html"); 
        } 
       }); 
      } 
     }); 

     slider.setMinimum(1); 
     slider.setMaximum(messagesController.getMax()); 
     slider.setValue(messagesController.getMax()); 
     slider.addChangeListener(new javax.swing.event.ChangeListener() { 

      public void stateChanged(javax.swing.event.ChangeEvent evt) { 
       java.awt.EventQueue.invokeLater(new Runnable() { 

        public void run() { 
         int index = slider.getValue(); 
         LOG.fine("slider " + index); 
         messagesController.setIndex(index); 
         defaultTableModel = messagesController.getDefaultTableModel(); 
         table.setModel(defaultTableModel); 
         table.getSelectionModel().setSelectionInterval(1, 1); 
        } 
       }); 
      } 
     }); 
     table.getSelectionModel().setSelectionInterval(1, 1); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(3, 1)); 
     panel.add(table); 
     panel.add(text); 
     panel.add(slider); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setSize(screenSize); 
    } 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

Возможно, я неправильно pass-by-value, хотя я читал, что эти термины имеют разные значения в зависимости от контекста.

ответ

3

Почему я должен явно вызвать setModel() на JTable, если основной объект был обновлен?

Вы не должны.

Что может быть лучше для обновления JTable?

Обновление модели, TableModel, должны сгореть события, необходимые для уведомления мнения, JTable, чтобы обновить себя. DefaultTableModel делает это за вас; AbstractTableModel предоставляет удобные методы fireXxx() для вашей модели. Пример последнего here. См. Также How to Use Tables: Creating a Table Model.

Создание нового, пустого DefaultTableModel в News представляется ложным, так как модель (незримая) MessagesController оперативно заменяет ее.

Непонятно также, почему вы используете invokeLater() в ListSelectionListener и ChangeListener. Эти методы должны быть уже запущены на event dispatch thread. Если нет, вам необходимо синхронизировать доступ к любым общим данным.

+0

Должно быть, я делаю это неправильно. В новостях у меня есть Jtable, JFrame и т. Д. - вид. В MessageController, POJO bean, я заполняю DefaultTableModel. Я не знаю, что я делаю неправильно, кроме того, что он работает не так, как ожидалось, и как описано выше. Должен ли я редактировать вопрос, чтобы отразить новый код, или просто закрыть вопрос? – Thufir

+0

Чем ближе вы можете добраться до [sscce] (http://sscce.org/), тем лучше. Есть ли вероятность блокировать EDT при работе в сети? См. Также этот «SwingWorker» [пример] (https://sites.google.com/site/drjohnbmatthews/randomdata). – trashgod

+0

Я так не думаю. Я вернусь к этому позже, может быть, некоторое время поможет лучше понять ответ (ответы). Это не проблема EDT, я уверен, и все это на локальном хосте. благодаря! – Thufir

3

1) row = Math.abs(row); //how can this be negative?

если не существует какой-либо выбранной строки, то строка кода

int row = table.convertRowIndexToModel(table.getSelectedRow()); 

возвращает -1 значение, лучше было бы проверить if(table.getSelectedRow() > -1) перед чем

2) там нет причины замените TableModel и DefaultTableModel, JTable может вернуть свой TableModel, JTable#getModel

3) не уверен, что из контекста, но, может быть, у вас есть взгляд на JTable Sorting and Filtering

+0

спасибо, что выяснил, что проблема -1, где я думаю, -1 похож на «ложь». Хотя я не понимаю вашего основного ответа, я вернусь и прочитаю его позже. Я добавил ссылку на конец моего вопроса, который несколько более общий, чем, возможно, заявил. Мне, возможно, придется серьезно отредактировать мой вопрос. – Thufir

+0

Исправить все пункты; подробнее [здесь] (http://stackoverflow.com/a/10334049/230513). – trashgod