【问题标题】:Get column value from JTable after table is been edited编辑表格后从 JTable 中获取列值
【发布时间】:2016-02-15 16:36:24
【问题描述】:

有一个简单的 JTable,试图在编辑后获取最新的列值。

“Add File to Table”按钮将JTextField中的文件名和路径加载到JTable中

“从表中获取值”按钮将(尝试)从 JTable 中获取所有列值。

last column edited 之后并按下“从表中获取值”按钮是只返回前三列而不是编辑的列,最后一列什么也不返回!。

请问如何获取编辑后的列值?

代码

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.nio.file.Path;
import java.util.Vector;

public class viewTable {

    private JFrame frame;
    private JTextField textField;
    private JTable table;
    private static DefaultTableModel model;
    private static File file;

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

    public viewTable() {
        initialize();
    }
    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().setLayout(null);

        textField = new JTextField("C:\\Temp\\Temp.docx");
        textField.setBounds(159, 23, 393, 20);
        frame.getContentPane().add(textField);
        textField.setColumns(10);

        JButton btnAddFileTo = new JButton("Add File to Table");
        btnAddFileTo.setBounds(383, 54, 165, 23);
        frame.getContentPane().add(btnAddFileTo);
        btnAddFileTo.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                addFileToTable();   
            }

            private void addFileToTable() {
                file = new File(textField.getText());
                final Object[] rowEntries = new Object[4];
                int tableIndex = table.getRowCount();
                tableIndex = tableIndex + 1;
                if (tableIndex <= 9){rowEntries[0] = "0"+tableIndex+".";}
                else {rowEntries[0] = tableIndex+".";}

                Path fileNameAlone = file.toPath();

                fileNameAlone = fileNameAlone.getFileName();
                rowEntries[1] = fileNameAlone;
                rowEntries[2] = file;
                rowEntries[3] = "";
                model.addRow(rowEntries);
            }

        });

        table = new JTable(5,4);
        Object[] columnNames = { "Sl.no.", "File", "Path/Name", "Page no. to be added" };

        model = new DefaultTableModel();
        model.setColumnIdentifiers(columnNames);
        table.setModel(model);

        JScrollPane scrollTable = new JScrollPane(table);
        scrollTable.setBounds(111, 100, 464, 213);

        frame.getContentPane().add(scrollTable);

        JButton btnNewButton = new JButton("Get Values from the table");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                DefaultTableModel model1 = (DefaultTableModel)table.getModel();
                Vector pageNoData = model1.getDataVector();
                String pageNo; 

                pageNo = getPageNoValueFromTable(pageNoData, table);
                System.out.println("pageNo : "+pageNo);
            }
        });
        btnNewButton.setBounds(319, 349, 256, 23);
        frame.getContentPane().add(btnNewButton);
        frame.setBounds(100, 100, 725, 494);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    }

    public static String getPageNoValueFromTable(Vector itemData, JTable table){
        table.setRowSelectionInterval(0, 0);
        table.repaint();

        System.out.println(table.getModel().getValueAt(0, 3));

        //int myListCount = 0;
        DefaultTableModel model1 = (DefaultTableModel)table.getModel();
        Vector pageNoData = model1.getDataVector();

        String mySelectedPageNo = null;

        for(int i=0; i<pageNoData.size(); i++){
            Vector getItem = (Vector) pageNoData.get(i);
            for (int j=0; j<getItem.size(); j++){
                if (j == 3)
                    mySelectedPageNo = getItem.get(j).toString();
                System.out.println("getItem : "+getItem.get(j).toString());}
            }
        return mySelectedPageNo;
    }
}

输出:

getItem : 01.
getItem : Temp.docx
getItem : C:\Temp\Temp.docx
getItem : ?
pageNo : ?

请给我指示!谢谢

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    在 JTable 中编辑单元格时,表格不知道用户何时完成了对单元格的编辑。因此,用户有责任告诉表格何时停止编辑。这通常由以下人员完成:

    使用回车键或跳到下一个单元格或用鼠标单击另一个单元格

    您需要在 ActionListener 中添加一些代码

    if (table.isEditing())
        table.getCellEditor().stopCellEditing();
    

    我的书签中的一篇好文章here

    【讨论】:

    • Brilliant @Sheetal Mohan Sharma,效果很好……谢谢!
    • 也可以自己更新模型((Vector)getDataVector().elementAt(0)).elementAt(3) = value;
    • 谢谢@svasa,实现它的不同方式...谢谢
    • @svasa,不!这不是解决问题的方法。数据的更改应通过 TableModel 完成。您的应用程序代码不应直接与模型的数据存储交互。这就是模型具有 getter/setter 方法的原因。在这种情况下,表格编辑器将调用 setter 方法。
    • @svasa,没有 table.refresh() 方法。要更改表中的数据,请更新 TableModel。然后 TableModel 将通知表重新绘制自己。这就是你所做的一切。除了调用 TableModel 上的方法之外,不需要 repaint() 或其他任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多