Java 如何在单击按钮时向JTable单元格添加两个jTextFields
我有一个JTable、edit按钮和save按钮。单击编辑按钮时,我想将两个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
当我单击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不可编辑。我可以添加按钮和字符串,但按钮不可单击。现在,对于我正在使用的每一行面板,将它们添加到大面板中。谢谢你的代码。我试过这种方法,就像你解释的那样。我要做这部分。但在我的用例中,我将面板用于面板内的行。