这是我的代码,我在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)
{
}
}
}
});
答案 0 :(得分:0)
你写的代码对我有用。
但是,我对您的代码进行了一些更改,以便更有效地使用Swing。
我从main方法中删除了所有代码,并将其替换为对SwingUtilities invokeLater方法的调用。 invokeLater方法在Event Dispatch thread上创建和使用Swing组件。 Oracle和我要求所有Swing应用程序都在Event Dispatch线程上启动。
我将JTextField和JButton放在JPanel上。不要将除JPanel或其他面板类型组件之外的Swing组件添加到JFrame。
我将JFrame的创建与JPanel的创建分开。分而治之。关注点的分离使代码更易于阅读和测试。
我在创建JPanel和JFrame之前创建了它。按照我发布的顺序调用JFrame方法。
我删除了空布局和Swing组件的绝对定位。 Swing旨在与Swing layout managers一起使用。学习它们。使用它们。
我使用了几个空的JPanel边框在组件周围添加了一些空白区域。
我在动作监听器中修复了一些语法问题。在我的Eclipse IDE中,我删除了你的try / catch块,让Eclipse生成try / catch块。我添加了一个printStackTrace方法调用,以便将任何异常打印为堆栈跟踪。
这是代码。
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;
}
}