Java 如何在AWT(计算器作业)中查找按钮源
我们被要求制作一个简单的GUI计算器,我使用getSource()来检测按钮,因为这是他们教给我们的。它的工作原理是输入第一个和第二个值,然后选择操作。但我犯了一个错误,因为他们希望我们做的是数字也应该是按钮,就像一个真正的计算器。那么如何使用getSource()获取每个按钮的值呢?比如当我按下按钮1,2等于3。这就是我所做的Java 如何在AWT(计算器作业)中查找按钮源,java,awt,Java,Awt,我们被要求制作一个简单的GUI计算器,我使用getSource()来检测按钮,因为这是他们教给我们的。它的工作原理是输入第一个和第二个值,然后选择操作。但我犯了一个错误,因为他们希望我们做的是数字也应该是按钮,就像一个真正的计算器。那么如何使用getSource()获取每个按钮的值呢?比如当我按下按钮1,2等于3。这就是我所做的 import java.awt.*; import java.awt.event.*; public class SimpleCalculator implement
import java.awt.*;
import java.awt.event.*;
public class SimpleCalculator implements ActionListener
{
// containers
private Frame f;
private Panel p1, p2, p3, p4;
// components
private Label l1, l2, l3;
private TextField tf1, tf2, tf3;
private Button bAdd, bSub, bMul, bDiv, bClear;
public SimpleCalculator()
{
f = new Frame("My First GUI App");
p1 = new Panel();
p2 = new Panel();
p3 = new Panel();
p4 = new Panel();
l1 = new Label("First: ");
l2 = new Label("Second: ");
l3 = new Label("Result: ");
tf1 = new TextField(15);
tf2 = new TextField(15);
tf3 = new TextField(15);
bAdd = new Button("+");
bSub = new Button("-");
bMul = new Button("*");
bDiv = new Button("/");
bClear = new Button("C");
}
public void launchFrame()
{
// use default layout manager of the Panel (FlowLayout)
p1.add(l1);
p1.add(tf1);
p2.add(l2);
p2.add(tf2);
p3.add(l3);
p3.add(tf3);
p4.add(bAdd);
p4.add(bSub);
p4.add(bMul);
p4.add(bDiv);
p4.add(bClear);
// change the layout manager of the Frame,
// use GridLayout(4, 1)
f.setLayout(new GridLayout(4, 1));
f.add(p1);
f.add(p2);
f.add(p3);
f.add(p4);
f.pack();
f.setVisible(true);
// register event handlers
bAdd.addActionListener(this);
bSub.addActionListener(this);
bMul.addActionListener(this);
bDiv.addActionListener(this);
bClear.addActionListener(this);
f.addWindowListener(new MyCloseButtonHandler());
}
// override the actionPerformed method
public void actionPerformed(ActionEvent ae)
{
Object source = ae.getSource();
double num1, num2, result = 0.0;
if (tf1.getText() != null && tf2.getText() != null)
{
num1 = Double.parseDouble(tf1.getText());
num2 = Double.parseDouble(tf2.getText());
if (source == bAdd)
result = num1 + num2;
else if (source == bSub)
result = num1 - num2;
else if (source == bMul)
result = num1 * num2;
else if (source == bDiv)
result = num1 / num2;
else if (source == bClear)
{
tf1.setText("0.0");
tf2.setText("0.0");
tf3.setText("0.0");
}
else {}
// tf3.setText(new Double(result).toString());
tf3.setText("" + result);
}
}
private class MyCloseButtonHandler extends WindowAdapter
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
}
public static void main(String args[])
{
SimpleCalculator sc = new SimpleCalculator();
sc.launchFrame();
}
}
您可以检查源代码是否是按钮(实际上不是Nessery,因为您应该知道它只从按钮调用),然后键入cast to a Button并使用.getText()
我倾向于让数字的每个按钮,以及操作数的每个按钮,向“输入/输出”文本字段添加文本 还有一个按钮
=
(等于)。当=
按钮被激活时,调用评估I/O文本字段的内容并将结果写回
例如。
=
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
导入java.util.ArrayList;
//Java1.6中引入的脚本包
导入javax.script.ScriptEngineManager;
导入javax.script.ScriptEngine;
导入javax.script.ScriptException;
类ScriptEngineCalculator实现ActionListener、KeyListener{
私有最终JTextField io=新的JTextField(15);
私有最终ArrayList控件=新建ArrayList();
私有最终JPanel ui=新JPanel(新边界布局(2,2));
私有脚本引擎;
脚本引擎计算器(){
initUI();
}
公共最终无效初始值(){
//获取对JS引擎的引用
engine=new ScriptEngineManager().getEngineByExtension(“js”);
JPanel text=newjpanel(新的网格布局(0,1,3,3));
添加(文本、边框布局、页面开始);
Font=io.getFont();
font=font.deriveFont(font.getSize()*1.8f);
io.setFont(字体);
io.SET水平对齐(SwingConstants.Training);
io.setFocusable(假);
文本。添加(io);
JPanel按钮=新的JPanel(新的网格布局(4,4,2,2));
添加(按钮、边框布局、中心);
字符串[]键值={
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
“0”、“C”、“C+”
};
for(字符串keyValue:keyValues){
addButton(按钮、键值);
}
JButton等于=新JButton(“”);
配置按钮(等于);
ui.add(等于,BorderLayout.LINE_END);
ui.setboorder(新的空订单(5,5,5,5));
}
公共JComponent getUI(){
返回用户界面;
}
公共void addButton(容器c,字符串文本){
JButton b=新JButton(文本);
配置按钮(b);
c、 添加(b);
}
公共无效配置按钮(JButton b){
Font f=b.getFont();
b、 setFont(f.deriveFont(f.getSize()*1.5f));
b、 addActionListener(此);
b、 addKeyListener(此);
增加(b);
}
public void calculateResult(){
试一试{
对象结果=engine.eval(io.getText());
如果(结果==null){
io.setText(“输出为“null”);
}否则{
io.setText(result.toString());
}
}捕获(脚本异常){
io.setText(se.getMessage());
}
}
@凌驾
已执行的公共无效行动(行动事件ae){
String command=ae.getActionCommand();
开关(命令){
案例“C”:
io.setText(“”);
打破
案例“=”:
calculateResult();
打破
违约:
io.setText(io.getText()+命令);
打破
}
}
私有JButton getButton(字符串文本){
用于(JButton按钮:控件){
字符串s=button.getText();
if(text.endsWith)
||(s.等于(“=”)
&&(text.equals(“equals”)| text.equals(“Enter”)){
返回按钮;
}
}
返回null;
}
/*开始-因为我讨厌老鼠*/
@凌驾
public void键按下(KeyEvent ke){}
@凌驾
公开无效密钥已释放(密钥事件){
字符串s=KeyEvent.getKeyText(ke.getKeyCode());
JButton b=获取按钮;
如果(b!=null){
b、 requestFocusInWindow();
b、 doClick();
}
}
@凌驾
public void keyTyped(KeyEvent ke){}
/*结束-因为我讨厌老鼠*/
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(()->{
ScriptEngineCalculator sc=新ScriptEngineCalculator();
JFrame f=新JFrame(“Calculet”);
f、 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f、 setContentPane(sc.getUI());
f、 包装();
f、 setMinimumSize(f.getSize());
f、 setLocationByPlatform(真);
f、 setVisible(真);
});
}
}
这段代码当然很好用。但是你不认为这是一个糟糕的OO代码吗?没关系,我相信你比我更有经验。@Mohaimin“但你不认为这是一个糟糕的OO代码吗?”这是一个错误。SSCE可以免除很多事情,包括一些“OO设计”。这个想法是从SSCCE中收集一些想法,然后将它们应用到您的设计中。或者换言之,“不包括电池”。)@安德鲁:我明白。我很惊讶从一个有经验的人那里看到这样的代码,我对StackOverflow非常陌生,所以我不知道很多事情。我正在学习:)代码的哪一行/哪一部分会产生问题?
String sourceText;
if (ae.getSource() instanceof Button) {
sourceText = ((Button)ae.getSource()).getText();
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.ArrayList;
// script package introduced in Java 1.6
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
class ScriptEngineCalculator implements ActionListener, KeyListener {
private final JTextField io = new JTextField(15);
private final ArrayList<JButton> controls = new ArrayList<>();
private final JPanel ui = new JPanel(new BorderLayout(2, 2));
private ScriptEngine engine;
ScriptEngineCalculator() {
initUI();
}
public final void initUI() {
// obtain a reference to the JS engine
engine = new ScriptEngineManager().getEngineByExtension("js");
JPanel text = new JPanel(new GridLayout(0, 1, 3, 3));
ui.add(text, BorderLayout.PAGE_START);
Font font = io.getFont();
font = font.deriveFont(font.getSize() * 1.8f);
io.setFont(font);
io.setHorizontalAlignment(SwingConstants.TRAILING);
io.setFocusable(false);
text.add(io);
JPanel buttons = new JPanel(new GridLayout(4, 4, 2, 2));
ui.add(buttons, BorderLayout.CENTER);
String[] keyValues = {
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "C", "+"
};
for (String keyValue : keyValues) {
addButton(buttons, keyValue);
}
JButton equals = new JButton("=");
configureButton(equals);
ui.add(equals, BorderLayout.LINE_END);
ui.setBorder(new EmptyBorder(5, 5, 5, 5));
}
public JComponent getUI() {
return ui;
}
public void addButton(Container c, String text) {
JButton b = new JButton(text);
configureButton(b);
c.add(b);
}
public void configureButton(JButton b) {
Font f = b.getFont();
b.setFont(f.deriveFont(f.getSize() * 1.5f));
b.addActionListener(this);
b.addKeyListener(this);
controls.add(b);
}
public void calculateResult() {
try {
Object result = engine.eval(io.getText());
if (result == null) {
io.setText("Output was 'null'");
} else {
io.setText(result.toString());
}
} catch (ScriptException se) {
io.setText(se.getMessage());
}
}
@Override
public void actionPerformed(ActionEvent ae) {
String command = ae.getActionCommand();
switch (command) {
case "C":
io.setText("");
break;
case "=":
calculateResult();
break;
default:
io.setText(io.getText() + command);
break;
}
}
private JButton getButton(String text) {
for (JButton button : controls) {
String s = button.getText();
if (text.endsWith(s)
|| (s.equals("=")
&& (text.equals("Equals") || text.equals("Enter")))) {
return button;
}
}
return null;
}
/* START - Because I hate mice. */
@Override
public void keyPressed(KeyEvent ke) { }
@Override
public void keyReleased(KeyEvent ke) {
String s = KeyEvent.getKeyText(ke.getKeyCode());
JButton b = getButton(s);
if (b != null) {
b.requestFocusInWindow();
b.doClick();
}
}
@Override
public void keyTyped(KeyEvent ke) { }
/* END - Because I hate mice. */
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ScriptEngineCalculator sc = new ScriptEngineCalculator();
JFrame f = new JFrame("Calculet");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setContentPane(sc.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setLocationByPlatform(true);
f.setVisible(true);
});
}
}