Java 如何在单击按钮时向JTable单元格添加两个jTextFields

Java 如何在单击按钮时向JTable单元格添加两个jTextFields,java,swing,user-interface,jcomponent,Java,Swing,User Interface,Jcomponent,我有一个JTable、edit按钮和save按钮。单击编辑按钮时,我想将两个JTextFields插入到选定的特定单元格中。因此我可以将(字符串)写入这些文本字段。 当我单击save按钮时,我想从单元格中删除这两个文本字段并粘贴字符串(粘贴到表的同一单元格中)。为了使单元格可编辑,不需要向JTable中添加JTextField。可以重写isCellEditable(int行,int列)函数,以返回一个依赖于编辑按钮的布尔值。下面是一个例子: import javax.swing.*; impor

我有一个JTable、edit按钮和save按钮。单击编辑按钮时,我想将两个JTextFields插入到选定的特定单元格中。因此我可以将(字符串)写入这些文本字段。
当我单击save按钮时,我想从单元格中删除这两个文本字段并粘贴字符串(粘贴到表的同一单元格中)。

为了使单元格可编辑,不需要向JTable中添加JTextField。可以重写isCellEditable(int行,int列)函数,以返回一个依赖于编辑按钮的布尔值。下面是一个例子:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.EventQueue;
import java.awt.event.*;
import java.awt.Dimension;

public class EditTableExample extends JFrame {
    private boolean editable = false;
    public EditTableExample() {
        //set up jframe
        setPreferredSize(new Dimension(500, 500));
        setMinimumSize(new Dimension(500, 500));
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        //set up content pane
        JPanel contentPane = new JPanel();
        setContentPane(contentPane);
        //table model
        Object[][] tableContents = new Object[][]{ //contents of our table
                {"Person1", "City1"},
                {"Person2", "City2"},
                {"Person3", "City3"}
        };
        Object[] tableHeader = new Object[]{
                "Name", "City"
        };
        DefaultTableModel model = new DefaultTableModel(tableContents, tableHeader) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return editable;
            }
        };
        //table
        JTable table = new JTable(model);
        //scrollpane to house table
        JScrollPane tablePane = new JScrollPane(table);
        tablePane.setPreferredSize(new Dimension(450, 450));
        //button that will add a row
        JButton add = new JButton("Add Row");
        add.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                model.addRow(new Object[model.getColumnCount()]); //adds a new, empty row to the table
            }
        });
        //button that will toggle edit mode
        JButton edit = new JButton("Toggle Edit");
        edit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                editable = !editable; //switches the value of 'editable' on click
            }
        });
        //button to remove a row
        JButton remove = new JButton("Remove Row");
        remove.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                try {
                    model.removeRow(table.getSelectedRow()); //remove selected row
                }
                catch (ArrayIndexOutOfBoundsException e) {
                    JOptionPane.showMessageDialog(rootPane, "No Row Selected");
                }
            }
        });
        //add everything together
        contentPane.add(tablePane);
        contentPane.add(add);
        contentPane.add(edit);
        contentPane.add(remove);
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                EditTableExample e = new EditTableExample();
                e.setVisible(true);
            }
        });
    }
}

如您所见,isCellEditable函数将返回“editable”的值,这是一个布尔值,其值通过“edit”按钮进行切换。不是每个人有一个包含“姓名,城市”的单元格,而是有两列,一列表示此人的姓名,一列表示其所在城市。如果您还有其他问题,请告诉我。

JTable的默认功能有什么问题。它已经支持这一要求。您可以在单元格上单击tab键并开始键入,单元格中的数据将被更新。也可以双击单元格开始编辑。您所要做的就是重写JTable的
iseCellEditable(…)
方法。阅读教程。您在上一个问题中获得了链接。你目前的要求毫无意义。为什么要强迫用户点击编辑按钮呢?如果您将他们置于“编辑”模式,并且他们想要“取消”,会发生什么?如果用户在没有单击“保存”的情况下切换到另一个组件,会发生什么。要求不是很明确。也许当用户单击“编辑”时,您应该显示一个模态JDialog。然后,当对话框关闭时,您可以更新TableModel。我的想法是相同的,但要求是这样的。表保存逗号分隔的人名和城市名(在一列中)。并且每行都有编辑和删除按钮(带图标)。当用户单击edit时,他应该能够在两个文本字段(在同一单元格中)中编辑人名和城市名。“保存”按钮将以逗号分隔的字符串再次保存它们。也许会给您一些想法。当您想要编辑项目时,它会将单个JTextField添加到列表的一行中。在您的情况下,您可以将包含两个JTextFields的面板添加到JTable的单元格中。谢谢,我尝试了此解决方案,但Jlist不可编辑。我可以添加按钮和字符串,但按钮不可单击。现在,对于我正在使用的每一行面板,将它们添加到大面板中。谢谢你的代码。我试过这种方法,就像你解释的那样。我要做这部分。但在我的用例中,我将面板用于面板内的行。