У меня есть JTable, кнопка редактирования и кнопка сохранения. когда я нажимаю кнопку редактирования, я хочу вставить два JTextFields в конкретную выбранную ячейку. Так что я могу писать (строки) в эти текстовые поля. когда я нажимаю кнопку «Сохранить», я хочу удалить эти два текстовых поля из ячейки и вставить эти строки (в ту же ячейку таблицы).
1 ответ
Вам не нужно добавлять JTextField в JTable, чтобы ячейку можно было редактировать. Функцию isCellEditable(int row, int column) можно переопределить, чтобы она возвращала логическое значение, зависящее от кнопки редактирования. Вот пример:
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», логическое значение, значение которого переключается кнопкой «редактировать». Вместо того, чтобы иметь одну ячейку для каждого человека, содержащую «Имя, город», есть два столбца: один для имени человека и один для его города. Дайте мне знать, если у вас есть еще вопросы.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
iseCellEditable(...)
JTable. Прочитайте учебник. Вам дали ссылку в последнем вопросе. Ваше текущее требование не имеет смысла. Зачем заставлять пользователя делать дополнительный шаг по нажатию кнопки «Изменить»? Что произойдет, если вы переведете их в режим «Редактировать», а они захотят «Отменить»?