0

ユーザーがデータを挿入するjcomboboxとjtextfield initでフレームを作成するクラスがあります。次に、ユーザーがスイングでクラスを呼び出す別のクラスがあります。swing クラスは正常に動作しますが、他のクラスから呼び出すと、プログラムが終了した後にのみ表示されます。ユーザーがデータを挿入し、入力したデータをコードでさらに使用できるように [OK] をクリックするまで開いておく必要があります。

これでswingクラスのメインを呼び出します:

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

エラー:

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)
4

1 に答える 1

2

ダイアログが表示された時点でコードの実行を停止する、ある種のダイアログを使用する必要があります。

詳細については、ダイアログの作成方法をご覧ください。

この時点での基本的な推奨事項は、 を に変更する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);

コードに最後の一連の変更を加えた後、ダイアログは期待どおりに表示されます...

ここに画像の説明を入力

また、Java プログラミング言語のコード規則を一読することもできます。

更新しました...

displayGUIメソッドをconstraintsから...に変更privateします。public

public void displayGUI() {

あなたの「ランナー」クラスをもっと似たものに変更してください...

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

問題は、constraintsmain が UI をビルドして表示するジョブをイベント ディスパッチ スレッド (適切で正しい) に渡し、すぐに戻って、呼び出し元のコードを実行し続けることです...

コール チェーンが私を追跡することを知っていた...

于 2013-09-30T00:09:07.200 に答える