2012-04-03 3 views
3

Мне нужно создать поле со списком с множественным выбором, как этого достичь?Как создать Combobox с мультиселекцией?

+1

Вот ваш ответ: http://stackoverflow.com/ a/2860376/32090 –

+1

Я бы предложил использовать [JList] (http://docs.oracle.com/javase/6/docs/api/javax/swing/JList.html) для этого. – flash

+1

@ Андрю Томпсон: хороший совет :) – manhnt

ответ

2

Есть несколько основных проблем с созданием контента пользовательских выпадающей всплывающим (как список с): множественным выбором
1. Пользовательских интерфейс по умолчанию предполагает использование JList как содержание так, чтобы изменить это поведение, вы должны изменить весь ComboBoxUI
2. Вы не можете просто изменить список списков combobox по умолчанию в мультиселементный из-за того, что в конце только одно значение получает «выбранный», а в списке есть приемник мыши по умолчанию, который не сможет выбрать больше чем один элемент

Так что я бы посоветовал вам e простой JList вместо combobox или посмотрите на использование некоторых библиотек расширенных компонентов, таких как JideSoft - у них есть этот компонент и многое другое, которое вы не сможете быстро создать с помощью функций Swing.

+0

хороший момент, спасибо большое. – manhnt

+0

Его просто, что я уже пытался изменить всплывающее окно combobox в древовидное, и я потерпел неудачу - эта попытка заняла почти день. Поэтому я рекомендую использовать JList OR в качестве опции - JButton со всплывающим меню, содержащим любые компоненты/редакторы, которые вам нравятся. –

6

Я знаю, что вопрос довольно старый, но для тех, кто все еще ищет решение этой проблемы, попробуйте следующий код:

public class ComboSelections { 

public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, UnsupportedLookAndFeelException { 

UIManager.setLookAndFeel((LookAndFeel) Class.forName("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel").newInstance()); 

final JPopupMenu menu = new JPopupMenu(); 
JMenuItem one = new JCheckBoxMenuItem("One"); 
JMenuItem two = new JCheckBoxMenuItem("Two"); 
JMenuItem three = new JCheckBoxMenuItem("Three"); 
JMenuItem four = new JCheckBoxMenuItem("Four"); 
menu.add(one); 
menu.add(two); 
menu.add(three); 
menu.add(four); 


final JButton button = new JButton("Click me"); 
button.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (!menu.isVisible()) { 
      Point p = button.getLocationOnScreen(); 
      menu.setInvoker(button); 
      menu.setLocation((int) p.getX(), 
        (int) p.getY() + button.getHeight()); 
      menu.setVisible(true); 
     } else { 
      menu.setVisible(false); 
     } 

    } 
}); 

one.addActionListener(new OpenAction(menu, button)); 
two.addActionListener(new OpenAction(menu, button)); 
three.addActionListener(new OpenAction(menu, button)); 
four.addActionListener(new OpenAction(menu, button)); 

JFrame frame = new JFrame(); 
JPanel panel = new JPanel(); 
panel.add(button); 
frame.getContentPane().add(panel); 
frame.pack(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setVisible(true); 
} 

private static class OpenAction implements ActionListener { 

    private JPopupMenu menu; 
    private JButton button; 

    private OpenAction(JPopupMenu menu, JButton button) { 
     this.menu = menu; 
     this.button = button; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     menu.show(button, 0, button.getHeight()); 
    } 
} 
} 
+0

хорошее решение проблемы) – Denis

Смежные вопросы