Programa para cálculo de horas extras

Bom dia pessoal, sou novo aqui no fórum e previamente gostaria de pedir desculpas por qualquer eventual erro na publicação, também ainda estou engatinhando no java e o pouco que consegui fazer foi lendo publicações antigas e desenvolvendo aos poucos. Estou tentando criar um programa de horas extras na empresa onde eu trabalho, ao iniciar o programa pede a quantidade de dias do mês que vão ser trabalhadas e após isso pede a quantidade de horas a serem trabalhadas também. Até ai tudo bem, o programa tem 4 JTextField, onde o usuário irá entrar os dados referente a hora de saída/entrada, fiz um contador no botão de lançamento do dia para que o usuário saiba em que dia parou e não se perca na inserção. Segue o código abaixo.

package view;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.text.MaskFormatter;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.Font;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class TelaPrincipal extends JFrame {

private JPanel contentPane;
private JTextField txtEntradaManha;
private JTextField txtSaidaManha;
private JTextField txtEntradaTarde;
private JTextField txtSaidaTarde;

int dia, horas;
int fechamentoMesHora = 0;
int fechamentoMesMinutos = 0;
int finalHora = 0;

JButton btnMes = new JButton("Fechar M\u00EAs");
/**
 * Launch the application.
 */
public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				TelaPrincipal frame = new TelaPrincipal();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame.
 * @throws ParseException 
 */
public TelaPrincipal() throws ParseException {
	setTitle("Controle de Horas - DisFá");
	setResizable(false);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 500, 330);
	contentPane = new JPanel();
	contentPane.setBackground(Color.WHITE);
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(null);
	
	JPanel panel = new JPanel();
	panel.setBackground(Color.WHITE);
	panel.setBounds(10, 11, 474, 210);
	panel.setBorder(new TitledBorder(null, "FECHAMENTO DI\u00C1RIO", TitledBorder.CENTER, TitledBorder.TOP, null, null));
	contentPane.add(panel);
	panel.setLayout(null);
	
	MaskFormatter mascaraHora = null;
	try {
		mascaraHora = new MaskFormatter("##:##");
	} catch (ParseException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
	
	JLabel lblNewLabel = new JLabel();
	lblNewLabel.setText("<html><u>Entrada Manhã</u>");
	lblNewLabel.setBounds(10, 40, 89, 14);
	panel.add(lblNewLabel);
	
	txtEntradaManha = new JFormattedTextField(mascaraHora);
	txtEntradaManha.setBounds(101, 34, 62, 20);
	panel.add(txtEntradaManha);
	txtEntradaManha.setColumns(10);
	
	JLabel lblNewLabel_1 = new JLabel();
	lblNewLabel_1.setText("<html><u>Saída Manhã</u>");
	lblNewLabel_1.setBounds(270, 40, 81, 14);
	panel.add(lblNewLabel_1);
	
	txtSaidaManha = new JFormattedTextField(mascaraHora);
	txtSaidaManha.setBounds(361, 34, 62, 20);
	panel.add(txtSaidaManha);
	txtSaidaManha.setColumns(10);
	
	JLabel lblNewLabel_2 = new JLabel();
	lblNewLabel_2.setText("<html><u>Entrada Tarde</u>");
	lblNewLabel_2.setBounds(10, 120, 81, 14);
	panel.add(lblNewLabel_2);
	
	txtEntradaTarde = new JFormattedTextField(mascaraHora);
	txtEntradaTarde.setBounds(101, 114, 62, 20);
	panel.add(txtEntradaTarde);
	txtEntradaTarde.setColumns(10);
	
	JLabel lblSadaTarde = new JLabel();
	lblSadaTarde.setText("<html><u>Saída Tarde</u>");
	lblSadaTarde.setBounds(270, 120, 81, 14);
	panel.add(lblSadaTarde);
	
	txtSaidaTarde = new JFormattedTextField(mascaraHora);
	txtSaidaTarde.setBounds(361, 114, 62, 20);
	panel.add(txtSaidaTarde);
	txtSaidaTarde.setColumns(10);
	
	JPanel panel_1 = new JPanel();
	panel_1.setBackground(Color.WHITE);
	panel_1.setBorder(new LineBorder(new Color(0, 0, 0)));
	panel_1.setBounds(10, 169, 153, 30);
	panel.add(panel_1);
	
	JLabel lblDia2 = new JLabel("Dias Restantes:");
	lblDia2.setFont(new Font("Tahoma", Font.BOLD, 11));
	panel_1.add(lblDia2);
	
	JLabel lblDia = new JLabel("            ");
	lblDia.setBackground(Color.LIGHT_GRAY);
	panel_1.add(lblDia);
	
	
	JButton btnDia = new JButton("Fechar Dia");
	btnDia.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			    final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat( "HH':'mm" );
				
				Calendar entradaManha = new GregorianCalendar( ) ;  
			    try {
					entradaManha.setTime(DATE_FORMAT.parse(txtEntradaManha.getText()));
				} catch (ParseException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}  

			    Calendar saidaManha = new GregorianCalendar( ) ;  
			    try {
					saidaManha.setTime(DATE_FORMAT.parse(txtSaidaManha.getText()));
				} catch (ParseException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			    
			    Calendar entradaTarde = new GregorianCalendar( ) ;  
			    try {
					entradaTarde.setTime(DATE_FORMAT.parse(txtEntradaTarde.getText()));
				} catch (ParseException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}  

			    Calendar saidaTarde = new GregorianCalendar( ) ;  
			    try {
					saidaTarde.setTime(DATE_FORMAT.parse(txtSaidaTarde.getText()));
				} catch (ParseException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			
			 int horasManha = saidaManha.get(Calendar.HOUR_OF_DAY) - entradaManha.get(Calendar.HOUR_OF_DAY);
			 int minutosManha = saidaManha.get(Calendar.MINUTE) - entradaManha.get( Calendar.MINUTE) ;  
			 
			 if (minutosManha < 0)
			 {
				 minutosManha += 60;
				 horasManha -= 1;
			 }
			 
			 int horasTarde = saidaTarde.get(Calendar.HOUR_OF_DAY) - entradaTarde.get(Calendar.HOUR_OF_DAY);
			 int minutosTarde = saidaTarde.get(Calendar.MINUTE) - entradaTarde.get( Calendar.MINUTE) ;  
			 
			 if (minutosTarde < 0)
			 {
				 minutosTarde += 60;
				 horasTarde -= 1;
			 }
			 
			 int totalHoraDia = horasTarde + horasManha;
			 int totalMinutosDia = minutosTarde + minutosManha;
			 
			 if (totalMinutosDia >= 60)
			 {
				 totalMinutosDia -= 60;
				 totalHoraDia += 1;
			 }
			 
			
			
			 
			 fechamentoMesHora = fechamentoMesHora + totalHoraDia;
			 fechamentoMesMinutos = fechamentoMesMinutos + totalMinutosDia;
			 
			 if (fechamentoMesMinutos >= 60)
			 {
				 fechamentoMesMinutos -= 60;
				 fechamentoMesHora += 1;
			 }
			 
			 
			dia -= 1;
			lblDia.setText(Integer.toString(dia));
			if (dia == 0)
			{
				btnDia.setEnabled(false);
				btnMes.setEnabled(true);
			}
		}
	});
	btnDia.setBackground(Color.WHITE);
	btnDia.setBounds(200, 176, 107, 23);
	panel.add(btnDia);
	btnMes.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			 finalHora = fechamentoMesHora - horas;
			 if ((finalHora < 0) && (fechamentoMesMinutos < 0))
			 {
				 JOptionPane.showMessageDialog(null, "O funcionário deve " + (finalHora * -1) + " hora(s) e " + fechamentoMesMinutos +" minuto(s) a empresa!");
			 }
			 else if (finalHora == 0) 
			 {
				 JOptionPane.showMessageDialog(null, "O funcionário não deve e nem tem horas extras!");
			 }
			 else 
			 {
				 JOptionPane.showMessageDialog(null, "O funcionário tem " + (finalHora) + " hora(s) e " + fechamentoMesMinutos + " minuto(s) extras!");
			 }
			/* String horasTrabalhadas = String.format("%02dh%02dmin",fechamentoMesHora, fechamentoMesMinutos);
			 String mensagem = ("Horas Trabalhadas: " + horasTrabalhadas);
			 JOptionPane.showMessageDialog(null, mensagem);*/
			 
			 
		}
	});
	
	
	btnMes.setBackground(Color.WHITE);
	btnMes.setBounds(210, 268, 107, 23);
	contentPane.add(btnMes);
	
	
	dia = Integer.parseInt(JOptionPane.showInputDialog("Digite a Quantidade de dias trabalhados:"));
	horas = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de horas a ser cumpridas:"));
	
	btnMes.setEnabled(false);
	lblDia.setText(Integer.toString(dia));
}

}

Tem alguma coisa errada, não sei se é em minha lógica ou se eu não soube usar a ferramenta da maneira correta. Peço desculpas se ficou muito vago a explicação do meu problema, se houver qualquer referente a explicação, tentarei explicar melhor. Obrigado desde já.

Tente descrever o que está acontecendo de errado.

Aqui na empresa a jornada diária é de 9 horas, de 8-12 e de 13-18. Quando fui testar peguei um cartão de ponto de um funcionário e inseri as horas de saída e entrada dele.

Entrada Manhã: 07:57 (3 minutos extras)
Saída Manhã: 12:08 (8 minutos extras)
Entrada Tarde: 13:12 (4 minutos debitados, porque é uma hora de almoço em relação a sua saída da manhã)
Saída Tarde: 19:21 (1 hora e 21 minutos extras)

No caso o programa deveria informar que o funcionário tem 1 hora e 28 minutos extras, mas ele informa que só há 1 hora e 20 minutos.

É por ai, não sei se ficou muito claro.

Esqueci de ponderar também no caso em que o funcionário ficaria devendo horas.

Por exemplo:

Entrada Manhã: 08:20 (20 minutos debitados).

E nos demais horários seguindo o padrão, no final o programa deveria informar que o funcionário deve 20 minutos, porém ele está informando que o funcionário deve 1 hora e 40 minutos.

Eu não consegui entender muito bem os seus cálculos, mas acho que se você trabalhar apenas com minutos para facilitar os seus cálculos.