TableModelListenerは、TableModelの変更をリッスンするオブジェクトのインターフェイスを定義します。
これをJTableに適用して、DefaultTableModelの変更をリッスンする方法は?さらに、setModelが呼び出された後、その機能を組み込むべきではありませんか?JTableにモデルへの変更を反映させたくないのはなぜですか?
NewsのdefaultTableModelの参照は、MessagesControllerと同じインスタンスを指しています(これは正しいですか?)。基になるオブジェクトが更新されている場合、なぜJTableでsetModelを明示的に呼び出す必要があるのですか?
JTableがそれ自体を更新するためのより良い方法は何ですか?おそらくtableChanged?
Newsの参照と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();
}
});
}
}
おそらく私は値渡しを誤解していますが、これらの用語は文脈によって異なる意味を持っていることを読みました。