TableModelListener определяет интерфейс для объекта, который прослушивает изменений в TableModel.setModel на JTable при изменении DefaultTableModel
Как применить это к 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, хотя я читал, что эти термины имеют разные значения в зависимости от контекста.
Должно быть, я делаю это неправильно. В новостях у меня есть Jtable, JFrame и т. Д. - вид. В MessageController, POJO bean, я заполняю DefaultTableModel. Я не знаю, что я делаю неправильно, кроме того, что он работает не так, как ожидалось, и как описано выше. Должен ли я редактировать вопрос, чтобы отразить новый код, или просто закрыть вопрос? – Thufir
Чем ближе вы можете добраться до [sscce] (http://sscce.org/), тем лучше. Есть ли вероятность блокировать EDT при работе в сети? См. Также этот «SwingWorker» [пример] (https://sites.google.com/site/drjohnbmatthews/randomdata). – trashgod
Я так не думаю. Я вернусь к этому позже, может быть, некоторое время поможет лучше понять ответ (ответы). Это не проблема EDT, я уверен, и все это на локальном хосте. благодаря! – Thufir