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

时间:2016-01-18 02:59:09

标签: java swing joptionpane sizing

好的,所以这是交易。目前,我正在使用它:

 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]); 

这就是我需要的。它创建一个下拉菜单,允许用户选择Rock,Paper或Scissors,然后将其输出到String中。问题是,它弹出的窗口非常小,位于屏幕的中心。我想将其重新调整为970像素乘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) {


}

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

所以,我要求解决其中一个问题。如何重新调整JOptionPane.showInputDialog()的大小,或者在单击按钮时让JFrame返回int值。

很抱歉,如果解释得很糟糕,我对JOptionPane和JFrames都很陌生。

1 个答案:

答案 0 :(得分:1)

JOptionPane是完全可配置的,它也很好地自包含,采用了大量重复的煮沸板代码并将其隐藏在一个易于使用的包中。

但这并不意味着您必须以这种方式使用它,您只需创建JOptionPane的实例,它只是JComponent的祖先,并将其添加到您想要的任何地方。

困难在于将所有功能集中在一起,因此您可以响应按钮,例如。

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

Big Dialog

所以,这个例子基本上把所有的锅炉板代码都包装成一个简单的类/方法,这样可以很容易地反复提示用户同一个问题,一遍又一遍......

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了解更多详情