Несколько вариантов из JOptionPane - PullRequest
4 голосов
/ 17 января 2012

У меня есть arraylist с объектами и работающий Gui.Я искал способ открыть маленькую рамку или коробку или что-то подобное, чтобы отобразить объекты из массива.Теперь пользователь должен иметь возможность выбрать один или несколько элементов, которые затем будут возвращены.

У меня уже есть панель параметров, но я могу просто выбрать один объект

    Object[] possibilities = lr.declarationList.toArray();
    String s = (String)JOptionPane.showInputDialog(
                        gui.getFrame(),
                        "Choose Target Nodes",
                        "Customized Dialog",
                        JOptionPane.PLAIN_MESSAGE,
                        null,
                        possibilities,
                        null);

Возможно, всплывающий список поможет.

Ответы [ 2 ]

9 голосов
/ 17 января 2012

Попробуйте использовать JOptionPane.showMessageDialog(...) с аргументом компонента JList, элементы которого получены из вашего списка, например:

JList list = new JList(new String[] {"foo", "bar", "gah"});
JOptionPane.showMessageDialog(
  null, list, "Multi-Select Example", JOptionPane.PLAIN_MESSAGE);
System.out.println(Arrays.toString(list.getSelectedIndices()));

Обратите внимание, что если вам нужно больше элементов макета в сообщенииСам объект, вы можете упаковать их все в JPanel и использовать этот компонент в качестве аргумента сообщения.

0 голосов
/ 01 апреля 2018

Вот версия, использующая JCheckBox:

import javafx.util.Pair;

public static <T> List<T> select(Component parent, String message, List<T> variants) {
        List<Pair<JCheckBox, T>> boxes = variants
                .stream()
                .map(variant -> new Pair<>(new JCheckBox(String.valueOf(variant)), variant))
                .collect(Collectors.toList());

        JPanel panel = new JPanel(new GridBagLayout());

        boxes.forEach(p -> panel.add(p.getKey(),
                new GridBagConstraints(
                        0,
                        boxes.indexOf(p),
                        1,
                        1,
                        1.0,
                        1.0,
                        GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL,
                        new Insets(0, 0, 0, 0),
                        0,
                        0
                )
        ));

        JOptionPane.showMessageDialog(parent, panel, message, JOptionPane.PLAIN_MESSAGE);

        return boxes.stream()
                .filter(p -> p.getKey().isSelected())
                .map(Pair::getValue)
                .collect(Collectors.toList());

    }
...