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

表模型侦听器不工作

淳于禄
2023-03-14

我正在使用JTable。每当单元格选择值更改时,我都想收到通知。但是我的代码不起作用。我正在使用TableModelListener。当我更改表单元格的值时,什么也不会发生。

public class Main extends JFrame{
    private JFrame frame;
    private DrawPanel jPanel;
    JRadioButton rdb2d;
    JRadioButton rdb3d;
    private JTable tbRect;
    private JTable tbCircle;

    List<Object> listCircle = new ArrayList<>();
    List<Object> listRect = new ArrayList<>();
    List<Object> undoCircle = new ArrayList<>();
    List<Object> undoRect = new ArrayList<>();
    List<Object> redoRedo = new ArrayList<>();

    public static void main(String[] args) {
        Main window = new Main();
        window.frame.setVisible(true);
    }


    public Main() { 
        frame = new JFrame();
        frame.setBounds(100, 100, 846, 494);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.setVisible(true);

        jPanel = new DrawPanel();
        jPanel.setBounds(220, 76, 600, 369);
        frame.getContentPane().add(jPanel);

        JPanel panel_1 = new JPanel();
        panel_1.setBounds(220, 11, 600, 54);
        frame.getContentPane().add(panel_1);

        JButton btnAdd = new JButton("Add");
        btnAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String[] buttons = { "Circle", "Rectangle" };
                int option = JOptionPane.showOptionDialog(null, "Choose a shape", "Confirmation", JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]);
                if (rdb2d.isSelected()) {
                    AbstractFactory aFactory = new FactoryProducer().getFactory("2d");
                    Shape2D shape2d = null;
                    if (option == 0) {
                        shape2d = aFactory.getShape2D("circle");
                        listCircle.add(shape2d);
                        updateTableCircle(listCircle);
                    }else if (option == 1) {
                        shape2d = aFactory.getShape2D("rectangle");
                        listRect.add(shape2d);
                        updateTableRect(listRect);
                    }
                    jPanel.add(shape2d);
                }else if (rdb3d.isSelected()) {                 
                    AbstractFactory aFactory = new FactoryProducer().getFactory("3d");
                    Shape3D shape3d = null;
                    if (option == 0) {
                        shape3d = aFactory.getShape3D("circle");
                        listCircle.add(shape3d);
                        updateTableCircle(listCircle);
                    }else if (option == 1) {
                        shape3d = aFactory.getShape3D("rectangle");
                        listRect.add(shape3d);
                        updateTableRect(listRect);
                    }
                    jPanel.add(shape3d);
                }
            }
        });
        panel_1.add(btnAdd);

        JButton btnRemove = new JButton("Remove");
        btnRemove.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                if (tbCircle.getSelectedRow() != -1) {
                    jPanel.remove(listCircle.get(tbCircle.getSelectedRow()));
                    listCircle.remove(tbCircle.getSelectedRow());
                    updateTableCircle(listCircle);
                }
                if (tbRect.getSelectedRow() != -1) {
                    jPanel.remove(listRect.get(tbRect.getSelectedRow()));
                    listRect.remove(tbRect.getSelectedRow());
                    updateTableRect(listRect);
                }
            }
        });
        panel_1.add(btnRemove);

        JButton btnUndo = new JButton("Undo");
        btnUndo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                jPanel.undo();

            }
        });

        panel_1.add(btnUndo);

        rdb3d = new JRadioButton("3D");
        panel_1.add(rdb3d);

        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(rdb2d);
        buttonGroup.add(rdb3d);

        JPanel panel = new JPanel();
        panel.setBounds(10, 11, 200, 434);
        frame.getContentPane().add(panel);
        panel.setLayout(null);

        JScrollPane jPane = new JScrollPane();
        jPane.setBounds(0, 36, 200, 125);
        panel.add(jPane);

        tbCircle = new JTable();
        tbCircle.setModel(new DefaultTableModel(
                new Object[][]{
                },
                new String[]{
                    "Position", "Radius"
                }
        ));

        jPane.setViewportView(tbCircle);
        tbCircle.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                System.out.println("Test Output");
            }
        });

        JScrollPane jPane2 = new JScrollPane();
        jPane2.setBounds(0, 248, 200, 163);
        panel.add(jPane2);

        tbRect = new JTable();

        tbRect.getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                System.out.println(e.getColumn());

            }
        });

        tbRect.setModel(new DefaultTableModel(
            new Object[][]{},
            new String[]{
                "Position", "Width", "Height"
            }
        ));
        jPane2.setViewportView(tbRect);
    }
}

当我更改表格单元格的值时,什么都没有发生。

共有1个答案

暨嘉
2023-03-14

您正在设置TableModelListener,然后设置一个新的TableModel。当然,旧模型已经消失,新模型没有被倾听。

尝试切换顺序,如:

tbRect = new JTable();

// set the model first
tbRect.setModel(new DefaultTableModel(
        new Object[][]{},
        new String[]{
            "Position", "Width", "Height"
        }
));

// register the model listener after the model is in place
tbRect.getModel().addTableModelListener(new TableModelListener() {
    @Override
    public void tableChanged(TableModelEvent e) {
        System.out.println(e.getColumn());

    }
});
 类似资料:
  • 我有一个简单的HibernateInterceptor,基本上我想自动设置几个字段。此拦截器(如下所示)扩展了EmptyInterceptor: 我使用spring配置文件进行布线,如下所示: 但是,永远无法到达拦截器。有人有什么线索吗?我还尝试将以下内容添加到事务管理器bean定义中,如下所示:

  • 大家好,我正在用ActiveMQ学习Spring JMS。在我的示例场景中,生产者应用程序在队列中发送大约50条消息,当我启动消费者应用程序时,它开始使用这些消息。 为每个侦听器启动的并发会话/使用者的数量。可以是表示最大值的简单数字(例如“5”),也可以是表示下限和上限的范围(例如“3-5”)。请注意,指定的最小值只是一个提示,可能会在运行时被忽略。默认值为1;如果有主题侦听器或队列排序很重要,

  • 问题内容: 我当时在上网,但找不到很好的信息。我试图在每次运行应用程序时检测按键。我正在使用JavaFX并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。

  • 我正在使用Realex Payments的HPP API开发一个卡支付页面,其中包含一个iFrame,用于托管Realex页面。在Realex请求表单上,我将字段HPP_POST_维度和HPP_POST_响应设置为我的URL,如下所示: 付款页: www.example.com/account/payment.html 隐藏字段值用于在HPP页面大小更改和事务完成时,使用事件侦听器将数据从Real

  • 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过watch选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。例如: <div id="watch-example"> <p> Ask a yes/no question: <input v-model="question">

  • 1. 前言 本节介绍侦听器 watch 的使用方法。包括什么是侦听器,侦听器的特点,以及如何对不同类型的数据进行监听。其中重点掌握对不同类型的数据如何使用侦听器,了解它之后,在才能在之后的日常开发中熟练运用。 2. 慕课解释 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。 — 官方定义 侦听器 watch 是 Vue 提供的一种用来观察和响应 Vue 实例上的数据