如何更改 JOptionPane.showOptionDialog() 的大小和位置

How do I change the size and location of JOptionPane.showOptionDialog()

好的,这就是交易。目前,我正在使用这个:

 String[] choices = {"Rock", "Paper", "Scissors"};
 String input = (String) JOptionPane.showInputDialog(null, "Please, make your choice", "Rock Paper Scissors!", JOptionPane.QUESTION_MESSAGE, null, choices, choices[0]); 

这就是我需要的。它创建了一个下拉菜单,允许用户 select 石头剪刀布,然后将其输出到字符串中。问题是,它弹出的 window 非常小,并且位于屏幕中央。我想将它的大小调整为 970 x 300 像素,并出现在 950 像素和 0 像素的位置。

现在,在你说之前,我已经尝试为此使用 JFrames,因为我知道如何获得它的大小和我想要的位置。但是,我无法让 ActionListener 以我希望的方式运行。

public static void main(String args[]) throws IOException
{
    JFrame hi = new JFrame("Hi");
    hi.setSize(970, 300);
    hi.setLocation(950, 0);
    System.out.println("Hi");
    Picture Hi = new Picture("c:/The Game/Cool.png");
    Hi.display();

    JButton B = new JButton("Hey There!");
    hi.add(B);

    int c = Output(hi);
}
public int Output(JFrame b)
{
    int j = 0;
    j = //CODE NEEDED HERE
    return j;
}
@Override
public void actionPerformed(ActionEvent arg0) {


}

所以,这个问题是我需要 JFrame 在 "CODE NEEDED HERE" 部分弹出,然后,在单击按钮时,return 某个值,然后关闭 JFrame。但是,JFrame 不会等待 Output() 函数,它会立即 returns j,它等于 0。相反,它只是执行 actionPerformed 函数中的任何操作。

所以,我正在寻求解决这些问题之一的方法。如何在单击按钮时重新调整 JOptionPane.showInputDialog() 的大小或使 JFrame 变为 return 一个 int 值。

抱歉,如果这真的解释得不好,我真的是 JOptionPane 和 JFrames 的新手。

JOptionPane 是相当可配置的,它也很好地自包含,将大量重复的、沸腾的板代码隐藏在一个易于使用的包中。

但这并不意味着你必须那样使用它,你可以简单地创建一个 JOptionPane 的实例,它只是 JComponent 的一个祖先,并将它添加到任何你想要的东西中想要。

困难在于将所有功能重新组合在一起,例如,您可以响应按钮。

请注意,您的示例将对话框放在我的任务栏下方(是的,我的位于屏幕顶部),所以我可以告诉您,作为用户,这会让我很烦!

因此,这个示例基本上将所有样板代码包装成一个简单的 class/method,这使得很容易一遍又一遍地重复提示用户相同的问题...

import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
import static javax.swing.JOptionPane.UNINITIALIZED_VALUE;
import static javax.swing.JOptionPane.VALUE_PROPERTY;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        String pick = Picker.pick();
        System.out.println("You picked " + pick);
        System.exit(0);
    }

    public static class Picker {

        public static String pick() {
            String[] choices = {"Rock", "Paper", "Scissors"};

            JOptionPane pane = new JOptionPane("Please, make your choice", JOptionPane.QUESTION_MESSAGE,
                    OK_CANCEL_OPTION, null, null, null);
            pane.setWantsInput(true);
            pane.setSelectionValues(choices);
            pane.setInitialSelectionValue(choices[0]);

            JDialog dialog = new JDialog();
            dialog.setModal(true);

            PropertyChangeListener listener = new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent event) {
                    // Let the defaultCloseOperation handle the closing
                    // if the user closed the window without selecting a button
                    // (newValue = null in that case).  Otherwise, close the dialog.
                    if (dialog.isVisible()
                            && (event.getPropertyName().equals(VALUE_PROPERTY))
                            && event.getNewValue() != null
                            && event.getNewValue() != JOptionPane.UNINITIALIZED_VALUE) {
                        dialog.setVisible(false);
                    }
                }
            };

            WindowAdapter adapter = new WindowAdapter() {
                private boolean gotFocus = false;

                public void windowClosing(WindowEvent we) {
                    pane.setValue(null);
                }

                public void windowClosed(WindowEvent e) {
                    dialog.removePropertyChangeListener(listener);
                    dialog.getContentPane().removeAll();
                }

                public void windowGainedFocus(WindowEvent we) {
                    // Once window gets focus, set initial focus
                    if (!gotFocus) {
                        pane.selectInitialValue();
                        gotFocus = true;
                    }
                }
            };
            dialog.addWindowListener(adapter);
            dialog.addWindowFocusListener(adapter);
            dialog.addComponentListener(new ComponentAdapter() {
                public void componentShown(ComponentEvent ce) {
                    // reset value to ensure closing works properly
                    pane.setValue(JOptionPane.UNINITIALIZED_VALUE);
                }
            });

            pane.addPropertyChangeListener(listener);

            dialog.add(pane);
            //dialog.pack();
            //dialog.setLocationRelativeTo(null);
            dialog.setSize(970, 300); // This is bad idea, use an EmptyBorder instead
            dialog.setLocation(950, 0);
            dialog.setVisible(true);

            String pick = null;
            Object value = pane.getInputValue();
            if (value != UNINITIALIZED_VALUE) {
                pick = value.toString();
            }

            return pick;

        }

    }

}

您在使用 JFrame 时遇到问题的原因是因为它没有设计成在显示时阻止代码执行,JDialog 可以,请参阅 How to Make Dialogs 了解更多详细信息