Как показать выбранный элемент JComboBox в JTextfield, если он выбран в противном случае нет? - PullRequest
0 голосов
/ 13 июня 2018

Я написал небольшую программу для поиска Имени человека по текстовому полю, так как я могу искать в контактах мобильного телефона.

Я помещаю 5 имен в поле со списком, когда я ищу «а», тогда он показывает все 5 имен, потому чтоу каждого есть символ «а», затем я выбираю 3-е или 4-е имя мышью, затем оно должно отображаться в текстовом поле, где я написал «а».

Каждый раз, когда он заменяет «а» в текстовом поле на 1-е имяв поле со списком я хочу написать 2-й, 3-й символ или выбрать из выпадающего списка в поле со списком.

Но я не могу этого сделать.

Для справки вот моя программа

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

class SearchName extends JFrame {

    private static final long serialVersionUID = -3725136550174445695L;
    private final JPanel contentPane;
    private JTextField textField;
    private static JComboBox<Object> comboBox;
    private static final List<String> name_list = Arrays.asList("RAM", "Abraham", "Adam", "Dawson", "Elisha");
    private final Object[] nameArray = name_list.toArray();
    private static final String specailcharacter = "[^a-zA-Z0-9]";

    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            SearchName frame = new SearchName();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    });
    }

    public SearchName() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    textField = new JTextField();
    textField.setBounds(10, 26, 297, 20);
    contentPane.add(textField);
    textField.setColumns(10);
    JButton btnNewButton = new JButton("Search");
    btnNewButton.setBounds(317, 25, 89, 23);
    contentPane.add(btnNewButton);
    comboBox = new JComboBox<Object>();
    comboBox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
        myBox(evt);
        }
    });
    comboBox.setVisible(true);
    comboBox.setOpaque(false);
    comboBox.setBorder(new LineBorder(new Color(171, 173, 179)));
    comboBox.setMaximumRowCount(20);
    comboBox.setBackground(Color.WHITE);
    comboBox.setBounds(10, 46, 297, 20);
    contentPane.add(comboBox);
    textField.addKeyListener(new KeyAdapter() {
        public void keyReleased(KeyEvent arg0) {
        if (arg0 != null) {
            if (arg0.getSource() != null) {
            txtPassKeyTyped(arg0);
            }
        }
        }
    });
    }

    protected void myBox(ActionEvent evt) {
    if (comboBox.getSelectedItem() != null) {
        textField.setText(comboBox.getSelectedItem().toString());
    }
    }

    private void txtPassKeyTyped(KeyEvent arg0) {
    if (arg0 != null) {
        if (arg0.getSource() != null) {
        clear();
        if (comboBox.getItemCount() == 0) {
            textField = (JTextField) arg0.getSource();
            if (textField != null) {
            if (textField.getText() != null) {
                if (!textField.getText().isEmpty()) {
                search(textField.getText(), "name", nameArray.length, nameArray);
                try {
                    comboBox.showPopup();
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
                comboBox.setMaximumRowCount(20);
                }
            }
            }
        }
        }
    }

    }

    private void clear() {
    if (comboBox.getItemCount() > 0) {
        comboBox.removeAllItems();
        comboBox.setMaximumRowCount(0);
        comboBox.hidePopup();
    }
    }

    private static void search(String searchString, String type, int numberOfContacts, Object[] contacts) {
    if (searchString != null) {
        if (!searchString.isEmpty()) {
        int found = 0;
        int[] results = new int[numberOfContacts];
        Checker c = null;
        if (type.equals("name")) {
            c = new Checker() {
            public boolean check1(Object p, String searchString) {
                boolean a = false;
                if (p.toString().toLowerCase().replaceAll(specailcharacter, "").contains(searchString)) {
                a = true;
                } else if (p.toString().toUpperCase().replaceAll(specailcharacter, "")
                    .contains(searchString)) {
                a = true;
                } else if (p.toString().replaceAll(specailcharacter, "").contains(searchString)) {
                a = true;
                } else {
                a = false;
                }
                return a;
            }
            };
        }
        for (int x = 0; x < numberOfContacts; x++) {
            if (c != null) {
            if (c.check1(contacts[x], searchString)) {
                results[found] = x;
                found++;
            }
            }
        }
        if (found > 0) {
            for (int x = 0; x < found; x++) {
            comboBox.addItem(contacts[results[x]]);
            comboBox.revalidate();
            comboBox.repaint();
            }
        }
        }
    }
    }

    private static interface Checker {
    public boolean check1(Object p, String searchString);
    }
}

1 Ответ

0 голосов
/ 13 июня 2018

Вам нужно каким-то образом сбросить текст после завершения набора текста.
Сохранить текст поиска в переменной initialText, а после завершения набора текста и запуска слушателей сбросить его до этого начального значения.

private void txtPassKeyTyped(KeyEvent arg0) {
    if (arg0 != null) {
      if (arg0.getSource() != null) {
        clear();
        if (comboBox.getItemCount() == 0) {
          textField = (JTextField) arg0.getSource();
          if (textField != null) {
            String initialText = textField.getText();
            if (textField.getText() != null) {
              if (!textField.getText().isEmpty()) {
                search(textField.getText(), "name", nameArray.length, nameArray);
                try {
                  comboBox.showPopup();
                } catch (Exception e1) {
                  e1.printStackTrace();
                }
                comboBox.setMaximumRowCount(20);
              }
            }
            textField.setText(initialText);
          }
        }
      }
    }
  }
...