事件派发线程异常?

时间:2016-03-17 13:45:13

标签: java eclipse

这是我的代码,我在eclipse上运行它并显示按钮和字段的框架,使用按钮应该返回字段fe中输入的等式的值。当我在字段中输入2 + 2并单击“oblicz”时它应该返回4但它没有,并且它会丢弃一些奇怪的异常。我错过了什么吗?

    static JTextField pole1;

    public static void main(String[]args)            
    {


        JFrame frame = new JFrame("applet 1.0");
        frame.setSize(700, 600);                    
        frame.setLocation(300, 100);                
        frame.setResizable(false);                    
        frame.setLayout(null);                        
        frame.setVisible(true);

        // pole

        pole1 = new JTextField();          
        pole1.setBounds(10, 10, 230, 50);              
        Font F1 = new Font("Comic Sans",Font.BOLD,20);  
        pole1.setFont(F1);  
        pole1.setHorizontalAlignment(JTextField.RIGHT);                                        
        frame.add(pole1);                                

       // button

        JButton button = new JButton("oblicz");  
        button.setBounds(10, 80, 100, 70);                
        button.setBorder(null);                            
        frame.add(button);

        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                {
                    String str = pole1.getText();

                    ScriptEngineManager mgr = new ScriptEngineManager();
                    ScriptEngine engine = mgr.getEngineByName("JavaScript");
                    String foo = str;
                    try
                        {
                        pole1.setText(String.valueOf(engine.eval(foo)));
                        }
                        catch (ScriptExecption e)
                        {

                        }

                }

            }
     });

1 个答案:

答案 0 :(得分:0)

你写的代码对我有用。

但是,我对您的代码进行了一些更改,以便更有效地使用Swing。

Applet GUI

  1. 我从main方法中删除了所有代码,并将其替换为对SwingUtilities invokeLater方法的调用。 invokeLater方法在Event Dispatch thread上创建和使用Swing组件。 Oracle和我要求所有Swing应用程序都在Event Dispatch线程上启动。

  2. 我将JTextField和JButton放在JPanel上。不要将除JPanel或其他面板类型组件之外的Swing组件添加到JFrame。

  3. 我将JFrame的创建与JPanel的创建分开。分而治之。关注点的分离使代码更易于阅读和测试。

  4. 我在创建JPanel和JFrame之前创建了它。按照我发布的顺序调用JFrame方法。

  5. 我删除了空布局和Swing组件的绝对定位。 Swing旨在与Swing layout managers一起使用。学习它们。使用它们。

  6. 我使用了几个空的JPanel边框在组件周围添加了一些空白区域。

  7. 我在动作监听器中修复了一些语法问题。在我的Eclipse IDE中,我删除了你的try / catch块,让Eclipse生成try / catch块。我添加了一个printStackTrace方法调用,以便将任何异常打印为堆栈跟踪。

  8. 这是代码。

    package com.ggl.testing;
    
    import java.awt.BorderLayout;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class JavascriptCalculator implements Runnable {
    
        private JButton button;
    
        private JTextField pole1;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new JavascriptCalculator());
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Applet 1.0");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(createPanel());
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.getRootPane().setDefaultButton(button);
            frame.setVisible(true);
        }
    
        private JPanel createPanel() {
            JPanel panel = new JPanel();
            panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            panel.setLayout(new BorderLayout());
    
            // pole
    
            JPanel polePanel = new JPanel();
            polePanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    
            pole1 = new JTextField(20);
            Font f1 = new Font("Comic Sans", Font.BOLD, 20);
            pole1.setFont(f1);
            pole1.setHorizontalAlignment(JTextField.RIGHT);
            polePanel.add(pole1);
    
            panel.add(polePanel, BorderLayout.CENTER);
    
            // button
    
            button = new JButton("oblicz");
            panel.add(button, BorderLayout.SOUTH);
    
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    String str = pole1.getText().trim();
    
                    ScriptEngineManager mgr = new ScriptEngineManager();
                    ScriptEngine engine = mgr.getEngineByName("JavaScript");
                    String foo = str;
    
                    try {
                        pole1.setText(String.valueOf(engine.eval(foo)));
                    } catch (ScriptException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            return panel;
        }
    }