当前位置:  开发笔记 > 编程语言 > 正文

无法使用setValueAt使用自定义TableModel更改JTable中的值

如何解决《无法使用setValueAt使用自定义TableModel更改JTable中的值》经验,为你挑选了1个好方法。

我编写了很少的访问时间表.它基于JTable,自定义TableModel扩展AbstractTableModel,如下图所示.

问题是可以初始化表并获得所需的外观 - 但在使用数据更改后setValueAt(),表的外观没有变化.按钮单击获取示例字符串并在9:00设置"类型"和"状态"列中的字段(更准确地说,取决于给定的小时和预订日期)

更重要的是,我能够在表的末尾插入新行,但无法使可见的现有值更新.尝试了许多解决方案,但遗憾的是没有结果.我会非常感谢每一个建议.

在此输入图像描述

说明问题的工作代码:

import java.awt.EventQueue;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ModelTest {

    private JFrame frame;
    private JTable tablePendingVisits;
    private PendingVisitModel pendingVisitModel;
    private JScrollPane scrollPanePendingVisits;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ModelTest window = new ModelTest();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public ModelTest() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 407);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JButton btnChangeValue = new JButton("Change value at 9:00");
        btnChangeValue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                refreshTableModel();
            }
        });
        btnChangeValue.setBounds(63, 308, 305, 23);
        frame.getContentPane().add(btnChangeValue);

        tablePendingVisits = new JTable();
        scrollPanePendingVisits = new JScrollPane();
        pendingVisitModel = new PendingVisitModel();

        tablePendingVisits.setModel(pendingVisitModel);
        scrollPanePendingVisits.setBounds(63, 36, 305, 246);
        scrollPanePendingVisits.setViewportView(tablePendingVisits);

        frame.getContentPane().add(scrollPanePendingVisits);
    }

    public void refreshTableModel(){
        String[] sampleString = {"9:00", "Bobby", "Tables"};

        // search for row with 9:00 and replace values in given columns
        for (int i = 0; i < pendingVisitModel.getRowCount(); i++) {

            if( sampleString[0].equals(pendingVisitModel.getValueAt(i, 0)) ) {   // Change row values when both hours are equal 
                pendingVisitModel.setValueAt(sampleString[1], i, 1);             // Change at type column
                pendingVisitModel.setValueAt(sampleString[2], i, 2);             // Change at status column      
            }
        }
    }
}

// Custom TableModel
class PendingVisitModel extends AbstractTableModel {

    private static final long serialVersionUID = 1L;

    private String[] columnNames = {"HOUR", "TYPE", "STATE"};
    private Vector data = new Vector();

    public PendingVisitModel() {

        for(int i = 8; i<15; i++) {
            data.add(new String[]{i+":00", "-", "Free"} );
            data.add(new String[]{i+":15", "-", "Free"} );
            data.add(new String[]{i+":30", "-", "Free"} );
            data.add(new String[]{i+":45", "-", "Free"} );
        }
    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return data.size();
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public String getValueAt(int row, int col) {
        String[] temp = data.get(row);
        if(temp.length > 0 && col < 3)
            return temp[col];
        else
            return null;
    }

    public void setValueAt(String[] value, int row, int col) {
        String[] temp = data.get(row);
        temp[col] = value[col];

        data.set(row, temp);
        fireTableRowsUpdated(row, row);
    }

    public void insertRow(String[] value) {
        data.add(value);
        fireTableRowsInserted(data.size(), data.size());
    }

    public void clearRows(){
        data.clear();
        fireTableDataChanged();
    }

    public void removeAllEntry(){
        data.clear();
        fireTableDataChanged();
    }

    public boolean isCellEditable(int row, int col) {
        return false;
    }

    @Override
    public Class getColumnClass(int colNum) {
        return String.class;
    }
}

MadProgramme.. 5

public void setValueAt(String[] value, int row, int col) {和之间有区别public void setValueAt(Object value, int row, int col) {

您可以使用@Override注释来测试它,例如......

@Override
public void setValueAt(String[] value, int row, int col) {

生成编译器错误,其中as

@Override
public void setValueAt(Object value, int row, int col) {

才不是.

所以将setValueAt方法改为......

@Override
public void setValueAt(Object value, int row, int col) {
    if (value instanceof String) {
        String[] temp = data.get(row);
        temp[col] = value.toString();

        data.set(row, temp);
        fireTableRowsUpdated(row, row);
    }
}

工作只是找到我

此外,你真的应该避免使用null布局,像素完美的布局是现代ui设计中的错觉.影响组件个体大小的因素太多,您无法控制.Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的结束,您将花费越来越多的时间来纠正

正如评论中所指出的,你也可以使用public void setValueAt(String value, int row, int col) {(没有覆盖注释)并且你的代码可以工作,但是我不会调用该方法,setValueAt因为这会产生混淆(正如你所发现的那样),并且排除了你所拥有的只是一个场景的场景.的例子TableModel



1> MadProgramme..:

public void setValueAt(String[] value, int row, int col) {和之间有区别public void setValueAt(Object value, int row, int col) {

您可以使用@Override注释来测试它,例如......

@Override
public void setValueAt(String[] value, int row, int col) {

生成编译器错误,其中as

@Override
public void setValueAt(Object value, int row, int col) {

才不是.

所以将setValueAt方法改为......

@Override
public void setValueAt(Object value, int row, int col) {
    if (value instanceof String) {
        String[] temp = data.get(row);
        temp[col] = value.toString();

        data.set(row, temp);
        fireTableRowsUpdated(row, row);
    }
}

工作只是找到我

此外,你真的应该避免使用null布局,像素完美的布局是现代ui设计中的错觉.影响组件个体大小的因素太多,您无法控制.Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的结束,您将花费越来越多的时间来纠正

正如评论中所指出的,你也可以使用public void setValueAt(String value, int row, int col) {(没有覆盖注释)并且你的代码可以工作,但是我不会调用该方法,setValueAt因为这会产生混淆(正如你所发现的那样),并且排除了你所拥有的只是一个场景的场景.的例子TableModel

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有