我是Java的新手和學生。我們的教授要求我們使用按鍵創建一個計算器。
以下是說明:
運行程式。用戶只能使用 KEYBOARD 輸入數字。輸入第一個數字后,您只能使用 4 BUTTONS 選擇所需的操作。按下按鈕后,您可以輸入第二個數字。按 SOLVE 按鈕在文本欄位中顯示答案。

我的問題是如何保存另外兩個命令以使用它來解決。
num1我使用 5 then 的示例(運算子和 then num2)。如何保存它們以在解決按鈕中使用。這讓我很困惑,因為那里只有一個文本框。我嘗試了兩個帶有以下代碼的文本框。它正在作業,但對于一個盒子沒有這樣做。
int a = Integer.parseInt(textFirst.getText());
int b = Integer.parseInt(textSecond.getText());
int c = 0;
if (e.getSource().equals(btnMulti)) {
c = a * b;
textResult.setText(String.valueOf("The product of " a " * " b " is " c));
}
到目前為止,這是我的代碼;
package first_Lab_2022;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Lab3_2 {
private JFrame frame;
private JTextField textField;
int num1,num2 = 0;
String operator="";
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Lab3_2 window = new Lab3_2();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Lab3_2() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.getContentPane().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
}
});
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
textField = new JTextField();
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
num1 = Integer.parseInt(textField.getText());
}
});
textField.setHorizontalAlignment(SwingConstants.RIGHT);
textField.setBounds(114, 73, 242, 60);
frame.getContentPane().add(textField);
textField.setColumns(10);
JButton btnAdd = new JButton("Add");
btnAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText(String.valueOf(" "));
}
});
btnAdd.setBounds(124, 144, 100, 23);
frame.getContentPane().add(btnAdd);
JButton btnSub = new JButton("Subtract");
btnSub.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText(String.valueOf("-"));
}
});
btnSub.setBounds(267, 144, 89, 23);
frame.getContentPane().add(btnSub);
JButton btnMul = new JButton("Multiply");
btnMul.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText(String.valueOf("*"));
}
});
btnMul.setBounds(124, 190, 100, 23);
frame.getContentPane().add(btnMul);
JButton btnDiv = new JButton("Divide");
btnDiv.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText(String.valueOf("/"));
}
});
btnDiv.setBounds(267, 190, 100, 23);
frame.getContentPane().add(btnDiv);
JButton btnSolve = new JButton("Solve");
btnSolve.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// String a = textField.getText();
// int i=Integer.parseInt(a);
}
});
btnSolve.setBounds(202, 227, 100, 23);
frame.getContentPane().add(btnSolve);
}
}
我確實希望有人在這方面幫助我。
uj5u.com熱心網友回復:
在這里提出這種問題有點危險,因為您可能會得到超出您的需求和/或理解范圍的答案。
我懷疑也許您可以利用JOptionPane提示用戶輸入第一個數字、運算子和最后一個數字,將每個請求的結果分配給一個變數。
您應該從查看如何制作對話框開始
要將輸入限制為數值,您可以使用如何使用格式化文本欄位或DocumentFilter. 兩者都不簡單。或者,您可以使用Integer.parse(String)決議提示用戶時回傳的文本并將其放入回圈中,直到獲得適當的回應。
對于運營商,我會簡單地使用 aJComboBox以便將用戶輸入限制為您想要的內容。請參閱如何使用組合框。
現在,在你問之前,不,我不能給你一個例子(事實上我已經在上面列出了一個數字)。練習的重點是讓你應用所學的知識。
根據改進的要求進行更新
你會后悔你問的。
基本概念是您在事件驅動的環境中運行,也就是說,有些事情發生了,您對此做出回應。你有責任管理狀態并根據可用資訊做事。
至于只接受整數的要求,您可以使用 a DocumentFilter,但這是一個相當高級的概念,請參閱實作檔案過濾器了解更多詳細資訊。或者,您可以只決議文本并在失敗時向用戶顯示錯誤訊息,這取決于您。
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
enum Operator {
ADD, SUBTRACT, MULTIPLE, DIVIDE;
}
private JTextField inputField;
private JToggleButton addButton = new JToggleButton("Add");
private JToggleButton subtractButton = new JToggleButton("Subtract");
private JToggleButton multipleButton = new JToggleButton("Multiple");
private JToggleButton divideButton = new JToggleButton("Divide");
private JButton solveButton = new JButton("Solve");
private JToggleButton[] operators = new JToggleButton[]{
addButton, subtractButton, multipleButton, divideButton
};
private Integer firstValue;
private Integer secondValue;
private Operator operator;
private ButtonGroup operatorButtonGroup = new ButtonGroup();
public TestPane() {
setBorder(new EmptyBorder(32, 32, 32, 32));
setLayout(new GridBagLayout());
inputField = new JTextField(10);
inputField.setHorizontalAlignment(JTextField.TRAILING);
((AbstractDocument) inputField.getDocument()).setDocumentFilter(new IntegerDocumentFilter());
inputField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
updateState();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateState();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateState();
}
});
operatorButtonGroup.add(addButton);
operatorButtonGroup.add(subtractButton);
operatorButtonGroup.add(multipleButton);
operatorButtonGroup.add(divideButton);
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = getCurrentValue();
if (firstValue != null) {
setOperator(Operator.ADD);
inputField.setText(null);
}
}
});
subtractButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = getCurrentValue();
if (firstValue != null) {
setOperator(Operator.SUBTRACT);
inputField.setText(null);
}
}
});
multipleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = getCurrentValue();
if (firstValue != null) {
setOperator(Operator.MULTIPLE);
inputField.setText(null);
}
}
});
divideButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = getCurrentValue();
if (firstValue != null) {
setOperator(Operator.DIVIDE);
inputField.setText(null);
}
}
});
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.anchor = GridBagConstraints.LINE_END;
add(inputField, gbc);
JPanel operatorPane = new JPanel(new GridLayout(2, 2));
operatorPane.add(addButton);
operatorPane.add(subtractButton);
operatorPane.add(multipleButton);
operatorPane.add(divideButton);
gbc.gridy ;
gbc.weightx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
add(operatorPane, gbc);
gbc.gridy ;
gbc.weightx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
add(solveButton, gbc);
solveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Integer secondValue = getCurrentValue();
if (firstValue != null && secondValue != null && operator != null) {
// Insert your logic here
resetState();
} else {
JOptionPane.showMessageDialog(TestPane.this, "Can't not solve equation, missing required parameters", "Error", JOptionPane.ERROR_MESSAGE);
}
}
});
solveButton.setEnabled(false);
setOperatorsEnabled(false);
}
protected void resetState() {
firstValue = null;
operator = null;
inputField.setText(null);
operatorButtonGroup.clearSelection();
updateState();
}
protected Integer getCurrentValue() {
try {
return Integer.parseInt(inputField.getText());
} catch (NumberFormatException exp) {
return null;
}
}
protected void setOperatorsEnabled(boolean enabled) {
for (JToggleButton btn : operators) {
btn.setEnabled(enabled);
}
}
protected void updateState() {
String currentValue = inputField.getText();
if (currentValue.isBlank()) {
solveButton.setEnabled(false);
setOperatorsEnabled(false);
} else {
if (operator != null) {
solveButton.setEnabled(true);
setOperatorsEnabled(false);
} else {
solveButton.setEnabled(false);
setOperatorsEnabled(true);
}
}
}
protected void setOperator(Operator operator) {
this.operator = operator;
updateState();
}
}
public class IntegerDocumentFilter extends DocumentFilter {
public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
try {
int parseInt = Integer.parseInt(text);
super.insertString(fb, offset, text, attr);
} catch (NumberFormatException exp) {
Toolkit.getDefaultToolkit().beep();
}
}
public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException {
if (string == null || string.isBlank()) {
super.replace(fb, offset, length, "", attr);
} else {
try {
int parseInt = Integer.parseInt(string);
super.replace(fb, offset, length, string, attr);
} catch (NumberFormatException exp) {
Toolkit.getDefaultToolkit().beep();
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416539.html
標籤:
上一篇:添加BorderLayout后如何自動調整剩余元素的大小?
下一篇:如何擺脫函式中的重復代碼?
