Как и в названии, я создаю пользовательский JComboBox, и пользовательский BasicComboPopup не скрывает, когда я пишу popup.hide(); Кроме того, если вы, ребята, знаете более простой способ создания JComboBox, который показывает сокращенные значения в основном компоненте, но не сокращенный контент во всплывающем окне, я все уши. Вот мой код:Пользовательский JComboBox не закрывается при двойном щелчке
import javax.swing.JComboBox;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import java.awt.Component;
import java.awt.Container;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JPopupMenu;
import javax.swing.plaf.basic.BasicComboPopup;
class ChangingCombos extends JFrame
{
String[] abbrStr = new String[]{"--","TF","FF","SP"};
String[] longStr = new String[]{"-Select One-","Thermo Film","Fashion Film","Specialty"};
AbbreviatedComboBox<String> box = new AbbreviatedComboBox<String>(longStr,abbrStr);
public ChangingCombos()
{
setLayout(new GridBagLayout());
add(box);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(300,300);
pack();
setVisible(true);
}
public static void main(String[]args)
{
new ChangingCombos();
}
class AbbreviatedComboBox<E> extends JComboBox<E>
{
E[] items = null;
E[] abbreviations = null;
BasicComboPopup popup = null;
JComboBox self = this;
JComboBox<E> abstractBox;
public AbbreviatedComboBox(E[] items, E[] abbreviations)
{
super(abbreviations);
this.items = items;
this.abbreviations = abbreviations;
abstractBox = new JComboBox<E>(items);
popup = new BasicComboPopup(abstractBox);
addCustomMouseListener(this);
for(Component c: GUIUtilities.getAllSubcomponentsOf(this))addCustomMouseListener(c);
}
private void addCustomMouseListener(Component c)
{
c.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
System.out.println("ohp");
if(!popup.isVisible())
{
popup.show(self,0,self.getHeight());
}
else popup.hide();
}
});
}
}
}
... также, чтобы объяснить GUIUtilities
, это еще один пользовательский класс и метод getAllSubcomponentsOf(Container c)
рекурсивно возвращает все компоненты, содержащиеся в указанном контейнере. Это быстрый способ получить доступ к маленькой кнопке стрелки на JComboBox. Может показаться, что это создаст проблему с добавлением нескольких прослушивателей к одному и тому же объекту, но он будет выполнять только одно действие через одно действие, как было проверено с печатью System.out.println("ohp")
только один раз за клик.
Редактировать: setVisible(false)
не работает. Метод hide, на который я ссылаюсь, равен ComboPopup.hide()
; он не устарел. Когда я делаю abstractBox.hidePopup()
, он ничего не делает, потому что abstractBox
не отображается на экране и никогда не предназначался. Просто его всплывающее окно. Продолжайте пытаться.
Нет, вы не должны использовать два массива для отслеживания ваших данных. Если у вас есть две части информации, вам необходимо создать пользовательский объект и сохранить объект в модели, как я объяснил в своем первоначальном ответе. Я обновляю свой ответ, чтобы показать, как вы можете отображать поле со списком и выпадающее меню по-разному. Поле со списком будет иметь индекс -1. В моем простом примере я просто отобразил номер выбора вместе со значением. В вашем случае у вас есть два свойства, чтобы вы отображали соответствующее свойство. Все мои другие комментарии из моего первоначального ответа по-прежнему применяются. – camickr