My Java is very rusty and I have been unlucky finding a better way to accomplish this task. I have two different methods which get called based on which radio button is selected. Is there a cleaner way to store/determine which radio button is currently selected in order to call the appropriate method? Here is the segment I am trying to streamline. (Full source code below)
public void actionPerformed(ActionEvent e){
if(e.getSource() == iterativeRadio){
calcMethod = "iterative";
}else if(e.getSource() == recursiveRadio){
calcMethod = "recursive";
}else if(calcMethod == null){
resultBox.setText("Select a calculation method");
}else{
try{
int n = Integer.parseInt(inputBox.getText());
if (e.getSource() == calcButton){
if(calcMethod == "iterative"){
resultBox.setText(String.valueOf(Sequence.computeIterative(n)));
efficiencyBox.setText(String.valueOf(Sequence.getEfficiency()));
}else if(calcMethod == "recursive"){
resultBox.setText(String.valueOf(Sequence.computeRecursive(n)));
efficiencyBox.setText(String.valueOf(Sequence.getEfficiency()));
}
}
}catch (NumberFormatException e2){
resultBox.setText("Invalid entry");
}catch (ArithmeticException e3){
resultBox.setText(e3.getMessage());
}catch (Exception e4){
resultBox.setText("Something bad happened");
}
}
}
Sequence.java:
/**
* @author Matthew Miller
* Sequence utility class
*/
public final class Sequence {
private static int efficiency;
public static int getEfficiency(){
return efficiency;
}
public static int computeIterative (int n){
efficiency = 0;
return iterativeWorker(0,1,n);
}
private static int iterativeWorker(int onePrev, int curr, int n){
if (n == 0){
return 0;
}else{
int twoPrev;
for(int i = curr; i < n; i++){
efficiency++;
twoPrev = onePrev;
onePrev = curr;
curr = Math.addExact(Math.multiplyExact(2, onePrev), twoPrev);
}
return curr;
}
}
public static int computeRecursive (int n){
efficiency = 0;
return recursiveWorker(n);
}
private static int recursiveWorker(int n){
efficiency++;
if (n == 0){
return 0;
}else if (n == 1){
return 1;
}else{
return Math.addExact(Math.multiplyExact(2, recursiveWorker(n - 1)), recursiveWorker(n - 2));
}
}
}
SequenceCalc.java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
/**
* @author Matthew Miller
* SequenceCalc/GUI class
*/
public class SequenceCalc extends JPanel implements ActionListener {
private static final long serialVersionUID = -5799806787577444436L;
private String calcMethod = "iterative";
private final JButton calcButton = new JButton("Calculate");
private final JRadioButton iterativeRadio = new JRadioButton("Iterative",true);
private final JRadioButton recursiveRadio = new JRadioButton("Recursive");
private final ButtonGroup radioGroup = new ButtonGroup();
private final JTextField inputBox = new JTextField();
private final JTextField resultBox = new JTextField();
private final JTextField efficiencyBox = new JTextField();
public SequenceCalc(){
iterativeRadio.addActionListener(this);
recursiveRadio.addActionListener(this);
calcButton.addActionListener(this);
resultBox.setEditable(false);
efficiencyBox.setEditable(false);
radioGroup.add(iterativeRadio);
radioGroup.add(recursiveRadio);
JFrame frame = new JFrame("Project 3");
JPanel mainPanel = new JPanel(new GridLayout(4,1,1,1));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
JPanel nRow = new JPanel(new GridLayout(1,2,1,1));
nRow.add(iterativeRadio);
nRow.add(recursiveRadio);
mainPanel.add(nRow);
nRow = new JPanel(new GridLayout(1,2,1,1));
nRow.add(inputBox);
nRow.add(calcButton);
mainPanel.add(nRow);
nRow = new JPanel(new GridLayout(1,2,1,1));
nRow.add(new JLabel("Result:"));
nRow.add(resultBox);
mainPanel.add(nRow);
nRow = new JPanel(new GridLayout(1,2,1,1));
nRow.add(new JLabel("Efficiency:"));
nRow.add(efficiencyBox);
mainPanel.add(nRow);
frame.add(mainPanel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
writeFile(generateReport(0,10));
frame.dispose();
}
});
}
@Override
public void actionPerformed(ActionEvent e){
if(e.getSource() == iterativeRadio){
calcMethod = "iterative";
}else if(e.getSource() == recursiveRadio){
calcMethod = "recursive";
}else if(calcMethod == null){
resultBox.setText("Select a calculation method");
}else{
try{
int n = Integer.parseInt(inputBox.getText());
if (e.getSource() == calcButton){
if(calcMethod == "iterative"){
resultBox.setText(String.valueOf(Sequence.computeIterative(n)));
efficiencyBox.setText(String.valueOf(Sequence.getEfficiency()));
}else if(calcMethod == "recursive"){
resultBox.setText(String.valueOf(Sequence.computeRecursive(n)));
efficiencyBox.setText(String.valueOf(Sequence.getEfficiency()));
}
}
}catch (NumberFormatException e2){
resultBox.setText("Invalid entry");
}catch (ArithmeticException e3){
resultBox.setText(e3.getMessage());
}catch (Exception e4){
resultBox.setText("Something bad happened");
}
}
}
public static String generateReport(int start, int end){
StringBuilder sb = new StringBuilder();
sb.append("Value of n,").append("Iterative,").append("Recursive\n");
for (int i=start;i<=end;i++){
//sb.append(i).append(",");
//Sequence.computeIterative(i);
sb.append(Sequence.computeIterative(i)).append(",");
sb.append(Sequence.getEfficiency()).append(",");
Sequence.computeRecursive(i);
sb.append(Sequence.getEfficiency()).append("\n");
}
return sb.toString();
}
private static void writeFile(String content){
try{
Writer fd = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("efficiency.csv"), "utf-8"));
fd.write(content);
fd.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
public static void main(String[] args){
new SequenceCalc();
}
}