【问题标题】:Is there a way to set a layout for JOptionsPane.showOptionDialog?有没有办法为 JOptionPane.showOptionDialog 设置布局?
【发布时间】:2015-09-27 05:18:17
【问题描述】:

如果您使用的数组是,假设长度为 15,并且您想一次显示它们,它会在一个非常长的显示框中并排显示它们:

String[] options = {"Option 1","Option 2","Option 3","Option 4",
    "Option 5","Option 6","Option 7","Option 8","Option 9",
    "Option 10","Option 11","Option 12","Option 13","Option 14",
    "Option 15"};

int displayoptions = JOptionPane.showOptionDialog (null, "select one", "Title",
    JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options [0]);

有没有办法显示它以使其具有流布局?

【问题讨论】:

    标签: java swing layout-manager joptionpane


    【解决方案1】:

    对于 15 个选项,我会这样做:

    import java.awt.*;
    import javax.swing.*;
    
    public class ManyOptions {
    
        ManyOptions() {
            initUI();
        }
    
        public void initUI() {
            String[] options = {"Option 1", "Option 2", "Option 3", "Option 4",
                "Option 5", "Option 6", "Option 7", "Option 8", "Option 9",
                "Option 10", "Option 11", "Option 12", "Option 13", "Option 14",
                "Option 15"};
    
            JComboBox combo = new JComboBox(options);
            int result = JOptionPane.showConfirmDialog(
                    null,
                    combo,
                    "Select One",
                    JOptionPane.DEFAULT_OPTION,
                    JOptionPane.WARNING_MESSAGE);
            if (result == JOptionPane.OK_OPTION) {
                System.out.println("Selected Index: " + combo.getSelectedIndex());
            } else {
                System.out.println("choice cancelled..");
            }
    
            // old way, for comparison..
            int displayoptions = JOptionPane.showOptionDialog(
                    null,
                    "select one",
                    "Title",
                    JOptionPane.DEFAULT_OPTION,
                    JOptionPane.WARNING_MESSAGE,
                    null,
                    options,
                    options[0]);
            System.out.println("displayoptions: " + displayoptions);
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    ManyOptions o = new ManyOptions();
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

      【解决方案2】:

      最好将 JPanel 与 GridLayout 一起使用,并将其显示在模态 JDialog 中(实际上是 JOptionPane)。例如,

      import java.awt.Component;
      import java.awt.Dialog.ModalityType;
      import java.awt.GridLayout;
      import java.awt.Window;
      import java.awt.event.ActionEvent;
      import javax.swing.AbstractAction;
      import javax.swing.BorderFactory;
      import javax.swing.JButton;
      import javax.swing.JDialog;
      import javax.swing.JPanel;
      import javax.swing.SwingUtilities;
      
      public class Foo1 {
         private static final int BUTTON_COUNT = 15;
         private static String selection = "";
         public static void main(String[] args) {
            JPanel panel = new JPanel(new GridLayout(3, 0, 5, 5));
            panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            for (int i = 0; i < BUTTON_COUNT; i++) {
               panel.add(new JButton(new ButtonAction("Option " + (i + 1))));
            }
            JDialog dialog = new JDialog(null, "Select One", ModalityType.APPLICATION_MODAL);
            dialog.add(panel);
            dialog.pack();
            dialog.setLocationRelativeTo(null);
            dialog.setVisible(true);
            System.out.println("selection: " + selection);
         }
      
         private static class ButtonAction extends AbstractAction {
            public ButtonAction(String name) {
               super(name);
            }
      
            @Override
            public void actionPerformed(ActionEvent e) {
               selection = e.getActionCommand();
               Component c = (Component) e.getSource();
               Window win = SwingUtilities.getWindowAncestor(c);
               win.dispose();
            }
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        相关资源
        最近更新 更多