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

Java 从另一个类调用gui,但在代码终止后出现,java,eclipse,swing,class,invoke,Java,Eclipse,Swing,Class,Invoke,我有一个类,它使用jcombobox和jtextfield init创建一个框架,用户在其中插入一些数据。然后,我有另一个类,在该类中,用户使用swing调用该类。尽管swing类工作正常,但当我从另一个类调用它时,它只会在程序终止后出现。我需要它一直打开,直到用户插入数据,然后单击ok,以便输入的数据可以在代码中进一步使用 我使用以下命令调用swing类main: new constraints(); constraints.main(null); 摇摆类的主要功能是:

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

我使用以下命令调用swing类main:

new constraints();
        constraints.main(null);
摇摆类的主要功能是:

    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();
        }
    }

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

请查看以了解更多详细信息

此时的基本建议是将
JFrame
更改为
JDialog
。一定要使它符合模态

根据OP的更改进行更新

别忘了让对话成为模态

final JDialog dialog = new JDialog();
dialog.setModal(true);
dialog.setDefaultCloseOperation(
                JDialog.DISPOSE_ON_CLOSE);
对话框可以是模态的。当模态对话框可见时,它会阻止用户 输入到程序中的所有其他窗口。JOptionPane创建 是模态的JDialogs。要创建非模态对话框,必须使用 直接调用JDialog类

虽然稍微高级一些,但您可以查看

根据其他例外情况进行更新

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

dialog.pack();
dialog.setVisible(true);
dialog.setContentPane(contentPane);
dialog.setLocationByPlatform(true);
尝试使用

dialog.setContentPane(contentPane);
dialog.pack();
dialog.setLocationByPlatform(true);
dialog.setVisible(true);
对代码进行最后一组更改后,对话框将按预期显示

您也可以通读一下

已更新…

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的任务传递给事件调度线程(这是正确的)并立即返回,让调用方代码继续运行


我知道呼叫链会追捕我…

我真的不知道它是怎么运作的。我必须移除我的swing组件并用JOptionPane替换它们@MadProgrammer对于
JDialog
,您只需更改对
JFrame
的引用,确保在执行此操作时将对话框设置为模态…所以我根本不使用框架@MadProgrammer@user2598911:准确地说,模态JDialog是解决这个问题的方法,1+到这个答案。了解JDialog就像JFrame一样,它可以显示一个完整的GUI,只是可以使其成为模态。您的主GUI将是一个JFrame,而您希望主GUI显示的另一个窗口将是您的模态JDialog。@user2598911:另外,不要使用
=
检查字符串是否相等,因为这会检查一个对象是否与另一个对象完全相同,这是您真正不关心的。而是使用
string1.equals(string2)
string1.equalsIgnoreCase(string2)
方法。
EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        Constraints constraints = new Constraints();
        constraints.displayGUI();
        System.out.println("Hello world");
    }
});