I need to develop the autocomple combobox with popup list. Every line of that list should highlight typed into autocomplete data.
I use glazedlists to make autocomplete. But what troubles me the most is how to highlight typed in combobox data in renderer?
It should look like this
Update:
I just want to know how to send typed string from jcombobox editor to list renderer. It doesn't matter I use glazedlists or not.
Somehow I figured out that I can send combobox into renderer and get information from combobox in renderer. But the thing is that I need getListCellRendererComponent to be called more often than it's now. Does anyone know, how I can make combobox call renderer getListCellRendererComponent more often?
Asked
Active
Viewed 852 times
0

Fake Man
- 271
- 1
- 3
- 8
-
this question hard to be answerable, additional JComponents, its methods and listeners (made by Glazed) are too localized for this forum – mKorbel Apr 19 '13 at 18:50
-
1could ne very nice question for standard JComboBox (doesn't matter if autocompleted) based on your [SSCCE](http://sscce.org/), short runnable, compilable, maybe some of answerers implemented this issue for JTable, Jlist, JComboBox (popup contains JList), to check if SwingX has implemented this feature – mKorbel Apr 19 '13 at 18:54
-
Yes, any answers may help. – Fake Man Apr 19 '13 at 19:00
-
and currency pairs could be without require to typing the slash "/" by user (in ComboBoxEditor), [is possible to do with](http://stackoverflow.com/a/7255918/714968), change is made on request, because tooooo muuuuuuch to confused the users :-) – mKorbel Apr 19 '13 at 20:55
1 Answers
0
This is possible. But bit of a hard work to do.
Here is a sample code I've found to change elements of a JList.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class ListDemo extends JPanel {
private JList list;
private DefaultListModel listModel;
public String match = null;
private static final String hireString = "Highlight";
private JTextField employeeName;
public ListDemo() {
super(new BorderLayout());
listModel = new DefaultListModel();
listModel.addElement("Test1");
listModel.addElement("Test2");
listModel.addElement("Test3");
list = new JList(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setSelectedIndex(0);
list.setVisibleRowCount(5);
list.setCellRenderer(new MyListCellRenderer());
JScrollPane listScrollPane = new JScrollPane(list);
JButton hireButton = new JButton(hireString);
HireListener hireListener = new HireListener(hireButton);
hireButton.setActionCommand(hireString);
hireButton.addActionListener(hireListener);
hireButton.setEnabled(false);
employeeName = new JTextField(10);
employeeName.addActionListener(hireListener);
employeeName.getDocument().addDocumentListener(hireListener);
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane,
BoxLayout.LINE_AXIS));
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(employeeName);
buttonPane.add(hireButton);
buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
add(listScrollPane, BorderLayout.CENTER);
add(buttonPane, BorderLayout.PAGE_END);
}
class MyListCellRenderer extends JLabel implements ListCellRenderer { // extended from JLabel. You can use an appropriate JComponent.
public MyListCellRenderer() {
setOpaque(true);
}
public Component getListCellRendererComponent(JList paramlist, Object value, int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
if (value.toString().equals(match)) {
setBackground(Color.BLUE);
SwingWorker worker = new SwingWorker() {
@Override
public Object doInBackground() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) { /*Who cares*/ }
return null;
}
@Override
public void done() {
match = null;
list.repaint();
}
};
worker.execute();
} else
setBackground(Color.RED);
return this;
}
}
class HireListener implements ActionListener, DocumentListener {
private boolean alreadyEnabled = false;
private JButton button;
public HireListener(JButton button) {
this.button = button;
}
public void actionPerformed(ActionEvent e) {
String name = employeeName.getText();
if (listModel.contains(name)) {
match = name;
list.repaint();
employeeName.requestFocusInWindow();
employeeName.selectAll();
return;
}
if (name.equals("")) {
Toolkit.getDefaultToolkit().beep();
employeeName.requestFocusInWindow();
employeeName.selectAll();
return;
}
int index = list.getSelectedIndex();
if (index == -1)
index = 0;
else
index++;
listModel.insertElementAt(employeeName.getText(), index);
employeeName.requestFocusInWindow();
employeeName.setText("");
list.setSelectedIndex(index);
list.ensureIndexIsVisible(index);
}
public void insertUpdate(DocumentEvent e) {
enableButton();
}
public void removeUpdate(DocumentEvent e) {
handleEmptyTextField(e);
}
public void changedUpdate(DocumentEvent e) {
if (!handleEmptyTextField(e))
enableButton();
}
private void enableButton() {
if (!alreadyEnabled)
button.setEnabled(true);
}
private boolean handleEmptyTextField(DocumentEvent e) {
if (e.getDocument().getLength() <= 0) {
button.setEnabled(false);
alreadyEnabled = false;
return true;
}
return false;
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("ListDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new ListDemo();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() { createAndShowGUI(); }
});
}
}
If you are bit good at java, you will clearly understand what has been done here.
(And sorry, I couldn't find a link for this code. Just copied my local code.)
And you can use getComboBox()
method of your glazedists to get the corresponding JComboBox
and;
JList l = new JList();
l.setModel(glazedlist1.getComboBox().getModel()); // glazedlist1 -> your auto complete list
will assign model of that combo box to a new JList
.
You can change the extending of class MyListCellRenderer extends JLabel implements...
into JTextPane
or JEditorPane
to format the texts seperately.
Hope this will help.
Sorry for incomplete code.

Praneeth Peiris
- 2,008
- 20
- 40
-
-
I also tried what you've been looking for. create `JList` programmatically and use it's model to change the `JComboBox`. In that case, you might need above code. – Praneeth Peiris Apr 21 '13 at 06:01