当前位置: 首页 > 知识库问答 >
问题:

DefaultTableModel更改时JTable上的setModel

滕英奕
2023-03-14

TableModelListener为侦听TableModel中更改的对象定义接口。

TableModelListener

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();
            }
        });
    }
}

共有1个答案

常心水
2023-03-14

如果基础对象已经更新,为什么必须在JTable上显式调用setmodel()

你不应该。

JTable更新自身的更好方法是什么?

还不清楚为什么在ListSelectionListenerChangeListener中使用Invokelater()。这些方法应该已经在事件分派线程上运行。如果没有,则需要同步对任何共享数据的访问。

 类似资料:
  • 我有一个从本地MySQL服务器获取信息的表。它很好地读取数据并将其发布在GUI上。 提前道谢。(给出一个关于DefaultTableModel的例子会很棒)

  • 我想从JTable获取DefaultTableModel,然后添加Column。我在JTable中搜索,但只找到了getModel()方法,然后无法添加列。最后,假设我在JTable中使用Binding方法设置日期,然后没有DefaultTableModel,我想添加列内容JButton添加到我的JTable中。

  • 这个问题可能已经得到了回答,我读过很多类似的,但对我不起作用。因此,我的具有扩展的自定义表模型。我的数据是和列名。那么,当我的数据发生更改时,如何更新表呢?我一直在使用,它正在工作,但它将我的自定义单元格呈现器重置为默认值。谢了。

  • 我在保存(包含模型)时遇到问题。只要我只添加行和数据,简单地序列化模型就没有问题。当我删除一行并尝试保存时,会生成一个IO异常。我的代码: 此代码用于保存模型: “模型”的定义如下: 我删除一行,如下所示: 这是我得到的例外: 我看不出在AWT EventQue中从何处获得空指针,在序列化之前是否必须更新模型?

  • > 我创建了一个函数,在该函数中我创建了表 我创建了另一个函数,它将我的数据从arraylist发布到我的表中。 到现在为止一切都很好。当我试图更新我的时,问题就出现了。实际上,我打开一个并尝试在列表中添加一个新项。我开始使用新项修改,但之后无法更新表,例如,我真的不知道将放在哪里,以及如何在需要时调用它。 我已经在这个网站上看到了一些问题,但我尝试的没有一个真正适用于我的程序。谢谢你的帮助,对不