【问题标题】:how to set & manage the layout of JOptionPane如何设置和管理 JOptionPane 的布局
【发布时间】:2013-07-11 03:24:57
【问题描述】:

我有一个带有一些组件的简单 JOptionPane,我想安排它们。

例如,我想将标签放在文本/密码字段旁边,设置它们的宽度等。

就像我是这样做的,结果当然不是我想要的:

public class CreateApplicationUserScreen {

  CreateApplicationUserScreen(){
    JLabel l_name=new JLabel("Username");
    JLabel l_pass=new JLabel("Password");
    JTextField tf_name=new JTextField(10);
    JPasswordField pf_pass=new JPasswordField(10);
    JButton b_privs = new JButton("Privs");
    JButton b_databases = new JButton("Databases");

    int res = JOptionPane.showOptionDialog(window, 
                                          new Object[] { l_name, tf_name, 
                                                         l_pass, pf_pass, 
                                                         b_privs, b_databases }, 
                                          "Create application user", 
                                          JOptionPane.OK_CANCEL_OPTION,
                                          JOptionPane.PLAIN_MESSAGE,null, 
                                          new String[]{"Create", "Cancel"},
                                          "default");
  }
}

【问题讨论】:

    标签: java swing layout-manager joptionpane


    【解决方案1】:

    您可以将任何 Swing 组件添加到选项窗格。所以构建你自己的面板:

    import java.awt.*;
    import javax.swing.*;
    
    public class OptionPanePanel
    {
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
    
            //  Build a custom panel
    
            JPanel panel = new JPanel( new GridLayout(2, 2) );
            panel.add( new JLabel("First Name") );
            JTextField firstName = new JTextField(10);
    //      firstName.addAncestorListener( new RequestFocusListener(false) );
            panel.add( firstName );
            panel.add( new JLabel("Last Name") );
            JTextField lastName = new JTextField(10);
            panel.add( lastName );
    
            int result = JOptionPane.showConfirmDialog(
                frame, // use your JFrame here
                panel,
                "Use a Panel",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.PLAIN_MESSAGE);
    
            if(result == JOptionPane.YES_OPTION)
            {
                System.out.println(firstName.getText() + " : " + lastName.getText());
            }
            else
            {
                System.out.println("Canceled");
            }
    
            //  Let Option Pane build the panel for you
    
            Object[] msg = {"First Name:", firstName, "Last Name:", lastName};
    
            result = JOptionPane.showConfirmDialog(
                frame,
                msg,
                "Use default layout",
                JOptionPane.OK_CANCEL_OPTION,
                JOptionPane.PLAIN_MESSAGE);
    
            if (result == JOptionPane.YES_OPTION)
            {
                System.out.println(firstName.getText() + " : " + lastName.getText());
            }
            else
            {
                System.out.println("Canceled");
            }
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

    这种方法的一个缺点是焦点会放在按钮上,而不是文本字段上。因此,您可能希望使用 RequestFocusListener 将焦点放在您的第一个文本字段上。

    【讨论】:

      【解决方案2】:
      • JOptionPane 使用BoxLayout,在 API 中实现

      • 您可以设置任何LayoutManagerFontIcon

      • 需要调用JOptionPane.pack(),如果改变了LayoutManager

      例如

      import java.awt.BorderLayout;
      import java.awt.GridLayout;
      import javax.swing.BorderFactory;
      import javax.swing.JComboBox;
      import javax.swing.JComponent;
      import javax.swing.JFrame;
      import javax.swing.JOptionPane;
      import javax.swing.JPanel;
      
      
      public class OptionPaneOptions {
      
          private JPanel options;
          private Object[] items;
      
          public OptionPaneOptions() {
              options = new JPanel(new GridLayout(0, 3));
              options.add(createOptionPane("Plain Message", JOptionPane.PLAIN_MESSAGE));
              options.add(createOptionPane("Error Message", JOptionPane.ERROR_MESSAGE));
              options.add(createOptionPane("Information Message", JOptionPane.INFORMATION_MESSAGE));
              options.add(createOptionPane("Warning Message", JOptionPane.WARNING_MESSAGE));
              options.add(createOptionPane("Want to do something?", JOptionPane.QUESTION_MESSAGE));
              items = new Object[]{"First", "Second", "Third"};
              JComboBox choiceCombo = new JComboBox(items);
              options.add(titled(new JOptionPane(choiceCombo,
                      JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION), "Question Message"));
              JFrame frame = new JFrame("JOptionPane'Options");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.add(options, BorderLayout.CENTER);
              frame.pack();
              frame.setVisible(true);
          }
      
          static JOptionPane createOptionPane(String message, int type) {
              JOptionPane pane = new JOptionPane(message, type);
              System.out.println(pane.getLayout());
              String title = message;
              if (type == JOptionPane.QUESTION_MESSAGE) {
                  title = "Question Message";
                  pane.setOptionType(JOptionPane.YES_NO_CANCEL_OPTION);
              }
              return titled(pane, title);
          }
      
           static <T extends JComponent> T titled(T c, String title) {
              c.setBorder(BorderFactory.createTitledBorder(title));
              return c;
          }
      
          public static void main(String[] args) {
              OptionPaneOptions test = new OptionPaneOptions();
          }
      }
      

      【讨论】:

      • 我不明白你的例子,因此我标记了#camickr 答案。
      猜你喜欢
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多