如何更改 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 了解更多详细信息
好的,这就是交易。目前,我正在使用这个:
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 了解更多详细信息