简体   繁体   English

编辑表后从JTable获取列值

[英]Get column value from JTable after table is been edited

Have a simple JTable, from that trying to get the latest column value after edited. 有一个简单的JTable,从中试图获得编辑后的最新列值。

"Add File to Table" button will load the file name and path from JTextField into the JTable “将文件添加到表”按钮会将文件名和路径从JTextField加载到JTable中

"Get Values from the table" button would (trying) get all the column values from the JTable. “从表中获取值”按钮将(尝试)从JTable中获取所有列值。

After the last column edited and press the "Get Values from the table" button is returns only first three columns but not the edited column, the last column returns nothing!. 编辑最后一列并按“从表中获取值”按钮后,仅返回前三列,而不返回已编辑的列,最后一列什么也不返回!

How to get the edited column value please? 请问如何获得编辑后的列值?

CODE

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

Output: 输出:

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

Please give me directions on this! 请给我指示! Thanks 谢谢

When editing a cell in a JTable the table doesn't know when a user is finished editing the cell. 在JTable中编辑单元格时,表不知道用户何时完成单元格的编辑。 Therefore it is the users responsibility to tell the table when to stop editing. 因此,用户有责任告诉表何时停止编辑。 This is normally done by: 通常通过以下方式完成此操作:

using the enter key or tabbing to the next cell or clicking on another cell with the mouse 使用Enter键或跳至下一个单元格或使用鼠标单击另一个单元格

You need to add some code to the ActionListener 您需要向ActionListener添加一些代码

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

A good article from my bookmarks here : 从我的书签一篇好文章在这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM