The problem right now is the element’s name is updated when I finished typing the new name in the text field and then clicking somewhere in the JList.
Current Problem (GIF):
I’m trying to update the element’s name in the JList while I’m typing the new name in the text field when the element is being selected. That means, I’m updating the element’s name in real-time.
Solution (GIF):
How do I achieve this? Thanks in advance.
Here’s an SSCCE code I used for the creation of the GIFs, given below:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class Test extends JFrame implements DocumentListener, ActionListener {
public static class Something {
public String name;
}
public static class CellNameRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Something something = (Something) value;
label.setText(something.name);
return label;
}
}
private static final long serialVersionUID = 1L;
JList<Something> list;
JTextField textField;
JButton addButton;
boolean isSelected;
public Test() {
final Dimension listSize = new Dimension(200, 300);
final Dimension textFieldSize = new Dimension(80, 10);
list = new JList<Something>(new DefaultListModel<Something>());
list.setMinimumSize(listSize);
list.setPreferredSize(listSize);
list.setCellRenderer(new CellNameRenderer());
textField = new JTextField();
textField.setMinimumSize(textFieldSize);
textField.setPreferredSize(textFieldSize);
textField.getDocument().addDocumentListener(this);
addButton = new JButton("Add");
addButton.addActionListener(this);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(list, BorderLayout.WEST);
panel.add(textField, BorderLayout.EAST);
panel.add(addButton, BorderLayout.CENTER);
this.add(panel);
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new Test();
}
@Override
public void changedUpdate(DocumentEvent event) {
/*
* PROBLEM: COULD NOT GET THE ELEMENT TO CHANGE NAME ON THE FLY WITHOUT CLICKING.
*/
if (!list.isSelectionEmpty()) {
Something something = list.getSelectedValue();
something.name = textField.getText();
DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
model.get(list.getSelectedIndex()).name = textField.getText();
list.revalidate();
}
}
@Override
public void insertUpdate(DocumentEvent event) {
/*
* PROBLEM: COULD NOT GET THE ELEMENT TO CHANGE NAME ON THE FLY WITHOUT CLICKING.
*/
if (!list.isSelectionEmpty()) {
Something something = list.getSelectedValue();
something.name = textField.getText();
DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
model.get(list.getSelectedIndex()).name = textField.getText();
list.revalidate();
}
}
@Override
public void removeUpdate(DocumentEvent event) {
/*
* PROBLEM: COULD NOT GET THE ELEMENT TO CHANGE NAME ON THE FLY WITHOUT CLICKING.
*/
if (!list.isSelectionEmpty()) {
Something something = list.getSelectedValue();
something.name = textField.getText();
DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
model.get(list.getSelectedIndex()).name = textField.getText();
list.revalidate();
}
}
@Override
public void actionPerformed(ActionEvent event) {
DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
Something something = new Something();
something.name = textField.getText();
model.addElement(something);
}
}