For an earlier assignment, we needed to create a calculator UI that was parsed f
ID: 3556517 • Letter: F
Question
For an earlier assignment, we needed to create a calculator UI that was parsed from an input file - this project is to assign functionality to that same project, but I'm running into a few stumbling blocks - in particular, I'm having a great deal of difficulty "Setting or Getting" text to the jtextfield when a button is pressed.
The specifications of the project are to make the Number, Add, Subtract, Divide and Minus keys function properly (Add numbers to the jtextfield, be able to add two numbers from the jtextfield together, etc etc. Basically it has to function like a calculator with these buttons should). If anyone could take a look at what I've got so far and lend a hand, (and/or implement the bolded options) I'd be extremely grateful.
Code I've got so far (Code and Required input text)
https://dl.dropboxusercontent.com/u/69225/Project1.java
https://dl.dropboxusercontent.com/u/69225/Input1.txt
Explanation / Answer
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Project1 {
private static Scanner scanInput;
private static File inputFile;
private static JTextField textField;
private static double number1;
private static boolean firstNumber;
private static char lastOperator;
private static boolean clearText;
static class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
char button = ((JButton)e.getSource()).getText().charAt(0);
if( button >= '0' && button <='9'){
if( clearText ){
textField.setText( ""+button );
clearText = false;
}
else
textField.setText( textField.getText() + button );
} else {
if( firstNumber ){
try{
number1 = Double.parseDouble( textField.getText() );
} catch (NumberFormatException ex){
number1 = 0;
}
firstNumber = false;
} else if( !clearText ){
double number2, result=0;
try{
number2 = Double.parseDouble( textField.getText() );
} catch (NumberFormatException ex){
number2 = 0;
}
switch(lastOperator){
case '+' : result = number1+number2;break;
case '-' : result = number1-number2;break;
case '*' : result = number1*number2;break;
case '/' :
if( number2 ==0 ){
textField.setText("Can't divide by zero");
clearText = true;
firstNumber = true;
result = 0;
return;
}
else
result = number1/number2;
break;
}
number1 = result;
textField.setText(Double.toString(number1));
}
clearText = true;
lastOperator = button;
}
}
}
public static void main(String[] args) throws FileNotFoundException, Exception {
String mainString, mainLabel;
firstNumber = true;
inputFile = new File("config.txt");
scanInput = new Scanner(inputFile);
if (scanInput.hasNextLine()) {
mainString = scanInput.nextLine();
mainLabel = labelMethod(mainString);
mainString = mainString.substring(mainLabel.length());
JFrame parsedFrame = (JFrame) recursiveParse(mainString, mainLabel);
parsedFrame.setVisible(true);
parsedFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
private static String labelMethod(String line) {
int i;
for (i = 0; i < line.length(); i++) {
if (!Character.isAlphabetic(line.charAt(i))) {
break;
}
}
return line.substring(0, i);
}
private static ArrayList<Integer> intArray(String str) throws Exception {
int i, n;
ArrayList<Integer> intArrayList = new ArrayList<>();
for (i = 0; i < str.length(); i++) {
for (n = i; n < str.length() && Character.isDigit(str.charAt(n)); n++) {
// null
}
if (i != n) {
intArrayList.add(Integer.parseInt(str.substring(i, n)));
}
i = n;
}
return intArrayList;
}
private static Component recursiveParse(String parseString, String parseLabel) throws Exception {
String swap;
if (parseLabel.equalsIgnoreCase("Window")) {
parseString = parseString.trim();
JFrame uiFrame;
if (parseString.charAt(0) == '"') {
parseString = parseString.substring(1);
uiFrame = new JFrame(parseString.substring(0, parseString.indexOf('"')));
parseString = parseString.substring(parseString.indexOf('"') + 1).trim();
}
else {
uiFrame = new JFrame("");
}
if (parseString.charAt(0) == '(') {
swap = parseString.substring(0, parseString.indexOf(')') + 1);
parseString = parseString.substring(swap.length());
ArrayList<Integer> ints = intArray(swap);
if (ints.size() == 2) {
uiFrame.setSize(ints.get(0), ints.get(1));
}
}
swap = labelMethod(parseString);
parseString = parseString.substring(swap.length());
JPanel uiPanel = new JPanel();
if (swap.equalsIgnoreCase("Layout")) {
swap = labelMethod(parseString);
parseString = parseString.substring(swap.length());
if (swap.equalsIgnoreCase("flow")) {
FlowLayout flow = new FlowLayout();
uiPanel.setLayout(flow);
}
if (swap.equalsIgnoreCase("grid")) {
if (parseString.charAt(0) == '(') {
swap = parseString.substring(0, parseString.indexOf(')') + 1);
ArrayList<Integer> parseInts = intArray(swap);
GridLayout parsedLayout;
if (parseInts.size() == 2) {
parsedLayout = new GridLayout(parseInts.get(0), parseInts.get(1));
uiPanel.setLayout(parsedLayout);
} else if (parseInts.size() == 4) {
parsedLayout = new GridLayout(parseInts.get(0), parseInts.get(1),
parseInts.get(2), parseInts.get(3));
uiPanel.setLayout(parsedLayout);
}
}
}
}
while (true) {
if (scanInput.hasNextLine()) {
parseString = scanInput.nextLine().trim();
swap = labelMethod(parseString);
if (swap.equalsIgnoreCase("end")) {
break;
}
else {
uiPanel.add(recursiveParse(parseString.substring(swap.length()), swap));
}
}
}
uiFrame.add(uiPanel);
return uiFrame;
}
if (parseLabel.equalsIgnoreCase("panel")) {
parseString = parseString.trim();
JPanel calcPanel = new JPanel();
swap = labelMethod(parseString);
parseString = parseString.substring(swap.length()).trim();
if (swap.equalsIgnoreCase("Layout")) {
swap = labelMethod(parseString);
parseString = parseString.substring(swap.length());
if (swap.equalsIgnoreCase("flow")) {
FlowLayout flow = new FlowLayout();
calcPanel.setLayout(flow);
}
if (swap.equalsIgnoreCase("grid")) {
if (parseString.charAt(0) == '(') {
swap = parseString.substring(0, parseString.indexOf(')') + 1);
ArrayList<Integer> ints = intArray(swap);
GridLayout parsedLayout;
if (ints.size() == 2) {
parsedLayout = new GridLayout(ints.get(0), ints.get(1));
calcPanel.setLayout(parsedLayout);
} else if (ints.size() == 4) {
parsedLayout = new GridLayout(ints.get(0), ints.get(1), ints.get(2),
ints.get(3));
calcPanel.setLayout(parsedLayout);
}
}
}
}
while (true) {
if (scanInput.hasNextLine()) {
parseString = scanInput.nextLine().trim();
swap = labelMethod(parseString);
if (swap.equalsIgnoreCase("end")) {
break;
} else {
Component tempComponent = recursiveParse(
parseString.substring(swap.length()), swap);
if (tempComponent != null) {
calcPanel.add(tempComponent);
}
}
}
}
return calcPanel;
}
if (parseLabel.equalsIgnoreCase("button")) {
parseString = parseString.trim();
JButton calcButton;
if (parseString.charAt(0) == '"') {
parseString = parseString.substring(1);
calcButton = new JButton(parseString.substring(0, parseString.indexOf('"')));
} else {
calcButton = new JButton();
}
calcButton.addActionListener( new ButtonListener() );
return calcButton;
}
if (parseLabel.equalsIgnoreCase("label")) {
parseString = parseString.trim();
JLabel Label;
if (parseString.charAt(0) == '"') {
parseString = parseString.substring(1);
Label = new JLabel(parseString.substring(0, parseString.indexOf('"')));
} else {
Label = new JLabel("");
}
return Label;
}
if (parseLabel.equalsIgnoreCase("textfield")) {
ArrayList<Integer> i = intArray(parseString.trim());
JTextField field = new JTextField(i.get(0));
textField = field;
return field;
} else {
}
return null;
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.