Calculadora em Java

Nesse código meu objetivo é fazer uma calculadora funcional que possa funcionar semelhante ao do windowns, pelo menos para cálculos básicos. O que eu gostaria é de ideias de como posso fazer com que essa calculadora retire os dados que eu passo no JTextArea e compile como uma conta mesmo, se há algum comando do qual eu consiga retirar apenas os números e dps adicionar os símbolos para que assim, ocorra a conta que eu passei.
Segue o código abaixo que executa um JFrame contendo todos os botões de numerais e de sinais e também a minha tentativa inicial de como fazer essa conta funcionar.

public class Calculator {
JFrame janela;
JButton zero, um, dois, tres, quatro, cinco, seis, sete, oito, nove, delete, divide,multi, soma, sub, perc, resultado, virgula, backspace;
JTextArea campo;
String text = " ";
DecimalFormat dc = new DecimalFormat( “0.00” );
Double valor, valor2;

public void iniciar() {
	//Definição da janela
	Font tamanhoAu = new Font("HEY", Font.BOLD, 27);
	janela = new JFrame("Calculadora");
	janela.setSize(300, 400);
	janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	janela.setLayout(null);
	janela.setVisible(true);
	

	campo = new JTextArea();
	campo.setBounds(10, 50, 90, 50);
	campo.setFont(tamanhoAu);
	JScrollPane sc = new JScrollPane(campo);
	sc.setBounds(10, 50, 270, 50);
	
	
	
	//Criação dos Botoes
	zero = new JButton("0");
	zero.setBounds(10, 235, 105, 30);
	zero.addActionListener(new zeroB());
	um = new JButton("1");
	um.setBounds(10, 200, 50, 30);
	um.addActionListener(new umB());
	dois = new JButton("2");
	dois.setBounds(65, 200, 50, 30);
	dois.addActionListener(new doisB());
	tres = new JButton("3");
	tres.setBounds(120, 200, 50, 30);
	tres.addActionListener(new doisB());
	quatro = new JButton("4");
	quatro.setBounds(10, 165, 50, 30);
	quatro.addActionListener(new quatroB());
	cinco = new JButton("5");
	cinco.setBounds(65, 165, 50, 30);
	cinco.addActionListener(new cincoB());
	seis = new JButton("6");
	seis.setBounds(120, 165, 50, 30);
	seis.addActionListener(new seisB());
	sete = new JButton("7");
	sete.setBounds(10, 130, 50, 30);
	sete.addActionListener(new seteB());
	oito = new JButton("8");
	oito.setBounds(65, 130, 50, 30);
	oito.addActionListener(new oitoB());
	nove = new JButton("9");
	nove.setBounds(120, 130, 50, 30);
	nove.addActionListener(new noveB());
	divide = new JButton(" / ");
	divide.setBounds(175, 130, 50, 30);
	divide.addActionListener(new divideB());
	multi = new JButton(" * ");
	multi.setBounds(175, 165, 50, 30);
	multi.addActionListener(new multiB());
	soma = new JButton(" + ");
	soma.setBounds(175, 235, 50, 30);
	soma.addActionListener(new somaB());
	sub = new JButton(" - ");
	sub.setBounds(175, 200, 50, 30);
	sub.addActionListener(new subB());
	perc = new JButton("%");
	perc.setBounds(230, 130, 50, 30);
	perc.addActionListener(new percB());
	resultado = new JButton("=");
	resultado.setBounds(230, 200, 50, 65);
	resultado.addActionListener(new resultadoB());
	virgula = new JButton(",");
	virgula.setBounds(120, 235, 50, 30);
	virgula.addActionListener(new virgulaB());
	backspace = new JButton("<--");
	backspace.setBounds(230, 165, 50, 30);
	backspace.addActionListener(new apagaB());
	
	delete = new JButton("C");
	
	
	janela.getContentPane().add(zero);
	janela.getContentPane().add(um);
	janela.getContentPane().add(dois);
	janela.getContentPane().add(tres);
	janela.getContentPane().add(quatro);
	janela.getContentPane().add(cinco);
	janela.getContentPane().add(seis);
	janela.getContentPane().add(sete);
	janela.getContentPane().add(oito);
	janela.getContentPane().add(nove);
	janela.getContentPane().add(divide);
	janela.getContentPane().add(multi);
	janela.getContentPane().add(soma);
	janela.getContentPane().add(sub);
	janela.getContentPane().add(perc);
	janela.getContentPane().add(virgula);
	janela.getContentPane().add(resultado);
	janela.getContentPane().add(backspace);
	
	
	janela.getContentPane().add(sc);
	
}

public class zeroB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + zero.getText();
		campo.setText(text);
	}
	
}

public class umB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + um.getText();
		campo.setText(text);
	}
	
}

public class doisB implements ActionListener {
	@Override
	
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + dois.getText();
		campo.setText(text);
	}
	
}
public class tresB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + tres.getText();
		campo.setText(text);
	}
	
}
public class quatroB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + quatro.getText();
		campo.setText(text);
	}
	
}
public class cincoB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + cinco.getText();
		campo.setText(text);
	}
	
}
public class seisB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + seis.getText();
		campo.setText(text);
	}
	
}
public class seteB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + sete.getText();
		campo.setText(text);
	}
	
}
public class oitoB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + oito.getText();
		campo.setText(text);
	}
	
}
public class noveB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + nove.getText();
		campo.setText(text);
	}
	
}
public class divideB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		Double valor = Double.parseDouble(campo.getText());
		text =  text + divide.getText();
		campo.setText(text);
	}
	
}
public class multiB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + multi.getText();
		campo.setText(text);
	}
	
}
public class subB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + sub.getText();
		campo.setText(text);
	}
	
}
public class somaB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + soma.getText();
		campo.setText(text);
	}
	
}
public class virgulaB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + virgula.getText();
		campo.setText(text);
	}
	
}
public class percB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		text = text + perc.getText();
		campo.setText(text);
	}
	
}
public class resultadoB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		Double sum1 = Double.parseDouble(campo.getText());
		System.out.println(sum1);
		
		
		
		
		
		
		
		
		
		campo.setText(dc.format(sum1));
		text = " ";
	}
	
}


public class apagaB implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		try {
			text = "";
			String str = campo.getText();
			StringBuilder apaga = new StringBuilder(str);
			str = String.valueOf(apaga.deleteCharAt(str.length()-1));
			campo.setText(str);
		}catch(StringIndexOutOfBoundsException ERRO ) {
			
		}
		
	}
	
}




public Calculator() {
	iniciar();
}

public static void main(String[] args) {
	new Calculator();
}

}

Sugiro que estude linguagens formais e compiladores, aí vai conseguir definir a gramática e implementar um compilador de expressões matemáticas.