JComboBox setPopupVisible не вызывается при нажатии стрелки - PullRequest
0 голосов
/ 25 января 2019

При нажатии на стрелку, чтобы открыть всплывающее окно на JComboBox, переопределенный setPopupVisible не вызывается, см. Минимальный пример ниже. Я просто что-то здесь упускаю или делаю что-то не так? Любые советы приветствуются:)

Цель в том, чтобы я хотел контролировать поведение видимости, особенно только скрывать его при определенных условиях, например, при проверке ввода (помните, что поле со списком доступно для редактирования).

Использование Java 8.

Создание фрейма с помощью пользовательского JComboBox:

import java.awt.Frame;
import javax.swing.BoxLayout;

public class Test {

public static void main(String[] args) {
    Frame frame = new Frame();
    frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
    MyComboBox combo = new MyComboBox();
    combo.setEditable(true);
    combo.addItem("bli");
    combo.addItem("bla");
    combo.addItem("blu");
    combo.addItem("ble");
    frame.add(combo);
    frame.pack();
    frame.setVisible(true);
}
}

Пользовательский JComboBox:

import javax.swing.JComboBox;

public class MyComboBox extends JComboBox {

@Override
public void setPopupVisible(boolean v) {
    if(!v) {
        System.out.println("HIDING COMBOBOX");
        super.setPopupVisible(v);
    } else {
        System.out.println("SHOWING COMBOBOX");
        super.setPopupVisible(v);
    }
}
}

1 Ответ

0 голосов
/ 25 января 2019

В JComboBox setPopupVisible(boolean) API НЕ существует, чтобы уведомлять, когда всплывающее окно открывается / закрывается. Он предназначен для программного отображения или скрытия всплывающего окна.

Если вы хотите получать уведомления при открытии / закрытии всплывающего окна, вы можете использовать addPopupMenuListener(), как показано ниже:

import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.Frame;

public class Test {

  public static void main(String[] args) {
    Frame frame = new Frame();
    frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
    MyComboBox combo = new MyComboBox();
    combo.setEditable(true);
    combo.addItem("bli");
    combo.addItem("bla");
    combo.addItem("blu");
    combo.addItem("ble");

    combo.addPopupMenuListener(new PopupMenuListener()
    {
      @Override
      public void popupMenuWillBecomeVisible(PopupMenuEvent e)
      {
        System.out.println("Popup Menu Will Become Visible");
      }

      @Override
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e)
      {
        System.out.println("Popup Menu Will Become Invisible");
      }

      @Override
      public void popupMenuCanceled(PopupMenuEvent e)
      {
        System.out.println("Popup Menu Canceled");
      }
    });

    frame.add(combo);
    frame.pack();
    frame.setVisible(true);
  }
}

class MyComboBox extends JComboBox
{

  @Override
  public void setPopupVisible(boolean v) {
    if(!v) {
      System.out.println("HIDING COMBOBOX");
      super.setPopupVisible(v);
    } else {
      System.out.println("SHOWING COMBOBOX");
      super.setPopupVisible(v);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...