java - 如何读取文件,将数据放入JTable中,然后修改单元格/删除行并将数据保存到文件中?

标签 java swing file jtable

我需要从 .txt 文件中读取日期并将其放入 GUI 中的 JTable 中,然后修改一些记录或删除一些行并将新数据保存到文件中。 我可以读取并显示 JTable,但如何使用 GUI 编辑日期或删除 JTable 中的某些行,然后将其保存到文件中?

最佳答案

but how to edit

您需要重写 DefaultTableModelisCellEditable(...) 方法以返回 true

delete some lines in JTable using GUI

您需要知道选择了哪一行,然后使用 DefaultTableModelremoveRow(...) 方法删除该行。

例如:

import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;

public class ItemDeletion extends JPanel
{
    private JList<String> list;
    private JTable table;

    public ItemDeletion()
    {
        setLayout( new BorderLayout(5, 5) );

        String[] items =
        {
            "One",
            "Two",
            "Three",
            "Four",
            "Five",
            "Six",
            "Seven",
            "Eight",
            "Nine",
            "Ten"
        };

        //  Add the list

        DefaultListModel<String> listModel = new DefaultListModel<String>();

        for (String item: items)
            listModel.addElement( item );

        list = new JList<String>( listModel );


        JButton listDelete = new JButton( "Delete From List" );
        listDelete.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                DefaultListModel model = (DefaultListModel)list.getModel();
                int row = list.getSelectedIndex();

                while (row != -1)
                {
                    model.removeElementAt( row );
                    row = list.getSelectedIndex();
                }
            }
        });

        JPanel listPanel = new JPanel( new BorderLayout(5, 5) );
        listPanel.add(new JScrollPane( list ), BorderLayout.CENTER);
        listPanel.add(listDelete, BorderLayout.PAGE_END);

        //  Add the table

        DefaultTableModel tableModel = new DefaultTableModel(0, 1);
        List<String> tableItems = Arrays.asList( items );
        Collections.shuffle( tableItems );

        for (String item: tableItems)
        {
            System.out.println( item );
            tableModel.addRow( new String[]{item} );
        }

        table = new JTable( tableModel );

        table.setAutoCreateRowSorter(true);
        ((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);

        JButton tableDelete = new JButton( "Delete From Table" );
        tableDelete.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                DefaultTableModel model = (DefaultTableModel)table.getModel();
                int row = table.getSelectedRow();

                while (row != -1)
                {
                    int modelRow = table.convertRowIndexToModel( row );
                    model.removeRow( modelRow );
                    row = table.getSelectedRow();
                }
            }
        });

        JPanel tablePanel = new JPanel( new BorderLayout(5, 5) );
        tablePanel.add(new JScrollPane( table ), BorderLayout.CENTER);
        tablePanel.add(tableDelete, BorderLayout.PAGE_END);

        add(listPanel, BorderLayout.LINE_START);
        add(tablePanel, BorderLayout.LINE_END);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Multiple Item Deletion");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ItemDeletion(), BorderLayout.NORTH);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

save it to the file?

您需要从DefaultTableModel获取数据。您可以使用 getValueAt(...) 方法来检索每个值。

因此您需要创建类似以下的代码:

for (each row);
{
    StringBuilder sb = new StringBuilder();

    for ( each column)
    {
        Object data = model.getValueAt(...);
        sb.append( data.toString() );
    }

    write the sb.toString() to the file
}

关于java - 如何读取文件,将数据放入JTable中,然后修改单元格/删除行并将数据保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549704/

相关文章:

java - 从同一类中的其他方法调用方法

java - CellType 无法解析为变量 setCellType 错误 Apache POI - Java

java - 如何在 JPanel 上创建新 Canvas ?

java - JTable 单元格中的 JPanel

java - 将一个面板类的按钮连接到另一个面板类的数据

java - 我的程序如何随机按下按钮?

java - 如何在不使用鼠标的情况下为 Facebook 粉丝专页上的页面点赞

c# - 在 Docker 中获取文件

php - 如何使用php上传文件到父目录

Java创建多个新文件