gpt4 book ai didi

java - 从另一个类调用gui,但在代码终止后出现

转载 作者:行者123 更新时间:2023-12-02 06:41:42 26 4
gpt4 key购买 nike

我有一个类,它使用 jcombobox 和 jtextfield init 创建一个框架,用户在其中插入一些数据。然后我有另一个类,其中用户通过 Swing 调用该类。尽管 swing 类工作正常,但当我从其他类调用它时,它只会在程序终止后才会出现。我需要将其打开,直到用户插入数据,然后单击“确定”,以便输入的数据可以在代码中进一步使用。

我用这个调用 swing 类 main:

new constraints();
constraints.main(null);

Swing 类主要是:

    public static void main(String[] args)
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
new constraints().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}

完整代码:

    public class constraints {



private static JTextField tField;
private MyDocumentFilter documentFilter;
private JLabel amountLabel;
private static String amountString = "Select Quantity of Products (in ktones): ";
public static String textstr = "" ;
public static String sig="" ;
public static String sigfinal="";

private void displayGUI()
{
// final JFrame frame = new JFrame("Constraints");

final JDialog dialog = new JDialog();
// frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
dialog.setDefaultCloseOperation(
JDialog.DISPOSE_ON_CLOSE);

amountLabel = new JLabel(amountString);

JPanel contentPane = new JPanel();
contentPane.setBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5));
tField = new JTextField(10);

amountLabel.setLabelFor(tField);

String[] Strings = { "Less", "Equal", "More"};
final JComboBox combo = new JComboBox(Strings) ;
combo.setSelectedIndex(0);

JButton button = new JButton("Ok");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){

textstr = tField.getText();



sig = (String) combo.getSelectedItem();

if (sig=="Less") {
sigfinal="l";
}else if (sig=="Equal"){
sigfinal="e" ;
}else if (sig=="More"){
sigfinal="m";
}


}
});

JButton button2 = new JButton("Close");
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
dialog.dispose();

}
});


((AbstractDocument)tField.getDocument()).setDocumentFilter(
new MyDocumentFilter());


contentPane.add(amountLabel);
contentPane.add(combo);
contentPane.add(tField);
contentPane.add(button);
contentPane.add(button2);

// JRootPane rootPane = frame.getRootPane();
JRootPane rootPane = dialog.getRootPane();
rootPane.setDefaultButton(button);

dialog.pack();
dialog.setVisible(true);
dialog.setContentPane(contentPane);
dialog.setLocationByPlatform(true);

// frame.setContentPane(contentPane);
// frame.pack();
// frame.setLocationByPlatform(true);
// frame.setVisible(true);
}

public static void main(String[] args)
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
new constraints().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}

class MyDocumentFilter extends DocumentFilter
{
@Override
public void insertString(DocumentFilter.FilterBypass fp
, int offset, String string, AttributeSet aset)
throws BadLocationException
{
int len = string.length();
boolean isValidInteger = true;

for (int i = 0; i < len; i++)
{
if (!Character.isDigit(string.charAt(i)))
{
isValidInteger = false;
break;
}
}
if (isValidInteger)
super.insertString(fp, offset, string, aset);
else
Toolkit.getDefaultToolkit().beep();
}

@Override
public void replace(DocumentFilter.FilterBypass fp, int offset
, int length, String string, AttributeSet aset)
throws BadLocationException
{
int len = string.length();
boolean isValidInteger = true;

for (int i = 0; i < len; i++)
{
if (!Character.isDigit(string.charAt(i)))
{
isValidInteger = false;
break;
}
}
if (isValidInteger)
super.replace(fp, offset, length, string, aset);
else
Toolkit.getDefaultToolkit().beep();
}
}

错误:

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The window is showing on screen.
at java.awt.Window.setLocationByPlatform(Unknown Source)
at constraints.displayGUI(constraints.java:101)
at constraints.access$1(constraints.java:29)
at constraints$3.run(constraints.java:116)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

您需要使用某种对话框,它将在对话框可见时停止代码执行。

看看How to make dialogs了解更多详情。

此时的基本建议是将 JFrame 更改为 JDialog。确保将其设置为模态。

根据 OP 的更改进行更新

不要忘记使对话框成为模态对话框!

final JDialog dialog = new JDialog();
dialog.setModal(true);
dialog.setDefaultCloseOperation(
JDialog.DISPOSE_ON_CLOSE);

A Dialog can be modal. When a modal Dialog is visible, it blocks user input to all other windows in the program. JOptionPane creates JDialogs that are modal. To create a non-modal Dialog, you must use the JDialog class directly.

来自 How to make dialogs

虽然稍微高级一点,但您可以看一下 How to use modality in dialogs

根据其他异常(exception)情况进行更新

您打开对话框/窗口的方式有问题。它可能会生成一个大小为 0x0 的窗口。而不是...

dialog.pack();
dialog.setVisible(true);
dialog.setContentPane(contentPane);
dialog.setLocationByPlatform(true);

尝试使用...

dialog.setContentPane(contentPane);
dialog.pack();
dialog.setLocationByPlatform(true);
dialog.setVisible(true);

对代码进行最后一组更改后,对话框将按预期显示...

enter image description here

您可能还希望通读Code Conventions for the Java Programming Language

已更新...

constraints中的displayGUI方法从private更改为public...

public void displayGUI() {

改变你的“运行者”类别,使其看起来更像......

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Constraints constraints = new Constraints();
constraints.displayGUI();
System.out.println("Hello world");
}
});

问题是,constraints main 将构建和显示 UI 的工作传递给事件调度线程(这很好且正确)并立即返回,让调用者代码继续运行。 ..

知道调用链会追捕我...

关于java - 从另一个类调用gui,但在代码终止后出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19084723/

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