gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:39:46 46 4
gpt4 key购买 nike

好的,事情就这样了。目前,我正在使用这个:

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

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

现在,在你说之前,我已经尝试使用 JFrame 来实现此目的,因为我知道如何获得它的大小并位于我想要的位置。但是,我无法让 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,然后单击按钮后返回某个值,然后关闭 JFrame。但是,JFrame 不会等待 Output() 函数,它会立即返回 j,它等于 0。相反,它只执行 actionPerformed 函数中的操作。

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

很抱歉,如果这真的很难解释,我对 JOptionPane 和 JFrames 真的很陌生。

最佳答案

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

关于java - 如何更改 JOptionPane.showOptionDialog() 的大小和位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34846645/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com