来自JOptionPane的多个选择

时间:2012-01-17 18:18:36

标签: java swing user-interface joptionpane

我有一个带有物体的arraylist和一个正在运行的Gui。我正在寻找一种方法来弹出一个小框架或框或类似于显示arraylist中的对象的方法。用户现在应该能够选择一个或多个随后返回的项目。

我已经有了选项窗格,但我只能选择一个对象

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

也许弹出列表会有所帮助。

2 个答案:

答案 0 :(得分:9)

尝试将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中,并将该组件用作消息参数。

答案 1 :(得分:0)

以下是使用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());

    }