0

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
1

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?

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
  • 1
    could 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 Answers1

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