好的,所以这是交易。目前,我正在使用它:
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都很陌生。
答案 0 :(得分:1)
JOptionPane
是完全可配置的,它也很好地自包含,采用了大量重复的煮沸板代码并将其隐藏在一个易于使用的包中。
但这并不意味着您必须以这种方式使用它,您只需创建JOptionPane
的实例,它只是JComponent
的祖先,并将其添加到您想要的任何地方。
困难在于将所有功能集中在一起,因此您可以响应按钮,例如。
请注意,您的示例将对话框置于我的任务栏下(是的,我的位于屏幕顶部),所以我可以告诉您,作为用户,这会让我烦恼!
所以,这个例子基本上把所有的锅炉板代码都包装成一个简单的类/方法,这样可以很容易地反复提示用户同一个问题,一遍又一遍......
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了解更多详情