Как сделать JCombobox похожим на JTextField - PullRequest
6 голосов
/ 05 мая 2009

Есть ли хороший (и простой) способ сделать JCombobox похожим на JTextField? Под этим я подразумеваю, что не должно быть кнопки раскрывающегося списка, но когда пользователь вводит что-то, он должен показывать многократные результаты.

В основном так же работает Google, YouTube, Facebook и т. Д.

Ответы [ 3 ]

6 голосов
/ 25 августа 2009
JComboBox comboBox = new JComboBox();
comboBox.setUI(new BasicComboBoxUI() {
    @Override
    protected JButton createArrowButton() {
        return new JButton() {
            @Override
            public int getWidth() {
                return 0;
            }
        };
    }
});

Выполнение getWidth (), возвращающее 0, гарантирует, что:
а) кнопка не отображается
б) для него не зарезервировано место, что позволяет вводить все поле

Я обнаружил, что должен был вызвать .setUI() через SwingUtilities.invokeLater(), но, в зависимости от структуры вашего кода, вам может и не понадобиться.

Если вы хотите автозаполнение, добавьте некоторые элементы в поле со списком и используйте AutoCompleteDecorator.decorate(comboBox). Класс AutoCompleteDecorator является частью SwingX , как упоминалось ранее.

Это может сделать ваш бокс странным при использовании другого L & F, поэтому вам придется выбрать, какой CombiBoxUI создать, чтобы получить правильный вид.

Если вы не хотите, чтобы раскрывающийся список появлялся, когда в поле со списком ничего нет, переопределите этот метод также в BasicComboBoxUI:

@Override
public void setPopupVisible(JComboBox c, boolean v) {
    // keeps the popup from coming down if there's nothing in the combo box
    if (c.getItemCount() > 0) {
        super.setPopupVisible(c, v);
    }
}
2 голосов
/ 31 августа 2009

У меня очень похожая проблема, меня не волнует всплывающая стрелка, но мне нужно контролировать внешний вид текста, когда компонент отключен.

Я хочу показать текущее значение, но отключить выбор / редактирование списка. Единственный способ получить такое поведение с помощью JComboBox - использовать comboBox.setEnabled (false); что делает текст нечитаемым светло-серым

Я создал ComoBoxUIDecorator и перехватил некоторые методы рисования. Это имеет совершенно правильный эффект - стрелка отображается серым цветом, а текущее значение отображается черным и читабельным (как если бы оно было включено).

public class ComboBoxUIDecorator extends ComboBoxUI {
 private ComboBoxUI m_parent;

 public ComboBoxUIDecorator(ComboBoxUI x) {
  m_parent = x;
 }
 ...
 public boolean isFocusTraversable(JComboBox c) {
  return m_parent.isFocusTraversable(c);
 }

 public void paint(Graphics g, JComponent c) {
  c.setEnabled(m_displayEnabledState);
  m_parent.paint(g, c);
  c.setEnabled(m_realEnabledState);
 }
}

Вы можете попробовать подобный подход; Если бы вы могли найти кнопку со стрелкой, вы могли бы закрасить стрелку после вызова m_parent.paint ()

2 голосов
/ 05 мая 2009

Вы хотите сказать, что хотите, чтобы он вел себя как текстовое поле, которое автоматически заполняло ранее введенные значения? SwingX включает поддержку добавления автозаполнения к текстовым компонентам.

Другая библиотека, на которую вы можете посмотреть: JIDE Common Layer . Их функциональность IntelliHints может быть то, что вы ищете. Демоверсию можно загрузить с здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...