📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Especialização em Sistemas com Java (Swing/JavaFX). Recomendado revisar antes de começar.

🖥️ Contador Interativo Desktop com Java Swing & MVC

v1.0 — Interfaces Desktop, Event Dispatch Thread (EDT), Layout Managers e MVC

Trilha de Especialização Pedagógica — Projeto 1 de 4

🎓 Nível Profissional Simulado: Desenvolvedor Java Desktop Júnior. Embora a web seja dominante, sistemas industriais, caixas de supermercado (PDV) e aplicações corporativas legadas rodam em Java Desktop. Compreender o funcionamento da Event Dispatch Thread (EDT) e o padrão MVC Desktop é um diferencial valioso.


🎯 Objetivo & Escopo do Projeto

Construir uma aplicação gráfica desktop de Contador e Painel de Controle em Java (JDK 21) com Swing, aplicando a arquitetura MVC (Model-View-Controller), ouvintes de eventos (ActionListeners) e renderização segura na Event Dispatch Thread (EDT).


🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Supervisor de Linha de Produção)

“Precisamos de um aplicativo de computador simples para nossos operadores registrarem a contagem de peças inspecionadas na esteira da fábrica. O programa deve ter um visor numérico grande, botões para Incrementar (+1), Decrementar (-1) e Resetar (0), além de mudar a cor do texto para vermelho se a meta de 100 peças for ultrapassada.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

ID Tipo Descrição Origem no Briefing
RF01 Funcional Exibir valor atual do contador em JLabel com tipografia ampliada. “visor numérico grande”
RF02 Funcional Botões para incrementar (+1), decrementar (-1) e resetar (0). “botões Incrementar, Decrementar, Resetar”
RF03 Funcional Alterar cor do visor dinamicamente quando o valor atingir o limiar estipulado. “mudar a cor do texto para vermelho”
RNF01 Não-Funcional Inicialização obrigatória na Event Dispatch Thread via SwingUtilities.invokeLater. Thread Safety UI
RNF02 Não-Funcional Separação das regras de negócio (Model) dos componentes visuais (View). Arquitetura MVC

📋 Fase 2 — Backlog & User Stories

ID User Story Prioridade
US01 Como operador, quero clicar nos botões e ver o visor numérico atualizado instantaneamente. Alta
US02 Como supervisor, quero que o layout seja centralizado e responsivo ao redimensionar a janela. Média

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# Branch da funcionalidade
git checkout -b feature/US01-swing-mvc-counter

# Compilar e executar com Java 21
javac -d bin src/com/portal/swing/*.java && java -cp bin com.portal.swing.Main

🛠️ Fase 4 — Implementação Guiada (MainFrame.java)

package com.portal.swing;

import javax.swing.*;
import java.awt.*;

public class MainFrame extends JFrame {
    private int contador = 0;
    private final JLabel lblValor;

    public MainFrame() {
        setTitle("Contador Industrial Swing");
        setSize(400, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout(10, 10));

        lblValor = new JLabel("0", SwingConstants.CENTER);
        lblValor.setFont(new Font("Arial", Font.BOLD, 48));
        add(lblValor, BorderLayout.CENTER);

        JPanel painelBotoes = new JPanel(new FlowLayout());
        JButton btnInc = new JButton("+1");
        JButton btnDec = new JButton("-1");
        JButton btnReset = new JButton("Reset");

        btnInc.addActionListener(e -> atualizar(contador + 1));
        btnDec.addActionListener(e -> atualizar(contador - 1));
        btnReset.addActionListener(e -> atualizar(0));

        painelBotoes.add(btnDec);
        painelBotoes.add(btnReset);
        painelBotoes.add(btnInc);
        add(painelBotoes, BorderLayout.SOUTH);
    }

    private void atualizar(int novo) {
        contador = novo;
        lblValor.setText(String.valueOf(contador));
        lblValor.setForeground(contador > 100 ? Color.RED : Color.BLACK);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true));
    }
}


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd javadesk_contador_01_swing

2. Execute a aplicação e os testes

javac -d bin src/**/*.java
java -cp bin com.exemplo.Main
# ou mvn test

[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd catalogo_projetos/javadesk_contador_01_swing`

🧭 Decisões de Arquitetura (ADRs)


🧪 Testes de Validação & Comportamento



🏛️ Arquitetura Visual & Engenharia de Software

O fluxo arquitetural abaixo detalha as camadas de interface, regras de negócio e homologação automatizada na subpasta desktop-swing/:

Arquitetura da Aplicação

flowchart TD
    subgraph Apresentacao["Camada de Interface & UI"]
        V1["Componentes Gráficos / Test Cases"] --> V2["Event Dispatcher / FXML"]
    end
    subgraph Controlador["Camada de Controle & Lógica"]
        C1["Action Listeners / Controllers"] --> C2["Máquina de Estados & Regras"]
    end
    subgraph Dominio["Camada de Domínio & Modelo"]
        M1["Entidades de Negócio"] --> M2["Persistência & Recursos"]
    end
    subgraph Homologacao["Qualidade & Homologação"]
        Q1["Testes Automatizados"] --> Q2["Checkpoints CP-01..05 PASS"]
    end

    Apresentacao --> Controlador
    Controlador --> Dominio
    Dominio --> Homologacao

    style Apresentacao fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
    style Controlador fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
    style Dominio fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
    style Homologacao fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

ID Persona História de Usuário Critério de Aceite Prioridade
US-01 Estudante de Java Desejo interface gráfica com botões de incremento, decremento e zerar Janela JFrame responsiva com layout centralizado e botões acessíveis Alta
US-02 Desenvolvedor Desktop Desejo arquitetura MVC separando modelo de dados e view Swing Model ContadorModel desacoplado de javax.swing.JLabel e JFrame Alta
US-03 Usuário do App Desejo feedback visual diferenciado quando o contador atingir valores negativos Alteração dinâmica de cor do texto (verde para positivo, vermelho para negativo) Média
US-04 Operador de UI Desejo atalhos de teclado (KeyBindings) para operar sem mouse Suporte a setas para cima/baixo e tecla ESC para reset do contador Média
US-05 Auditor de Código Desejo testes unitários automatizados validando regras do modelo Suíte JUnit validando operações do ContadorModel sem subir GUI Alta

⚙️ Requisitos Funcionais (RF)

ID Descrição do Requisito Criticidade
RF-01 Interface gráfica Swing com JFrame, JPanel, JButton e JLabel Alta
RF-02 Padrão arquitetural MVC puro com Controller mediando eventos Alta
RF-03 Controle de limites configuráveis (mínimo, máximo e passo) Alta
RF-04 Listeners de eventos (ActionListener e KeyListener) com threads Swing EDT Média
RF-05 Testes unitários isolados do modelo matemático de contagem Média

🛡️ Requisitos Não-Funcionais (RNF)

ID Especificação Arquitetural Criticidade
RNF-01 Execução estrita na Event Dispatch Thread (SwingUtilities.invokeLater) Alta
RNF-02 Compatibilidade multiplataforma com Look and Feel Nimbus nativo Média
RNF-03 Tempo de inicialização de UI inferior a 300ms Alta
RNF-04 Código Java 21 LTS limpo e sem dependências externas pesadas Média
RNF-05 Isolamento dos fontes na pasta desktop-swing/ Alta

🔗 Matriz de Rastreabilidade (RTM)

User Story Requisito Funcional Requisito Não-Funcional Módulo / Artefato de Código Status de Homologação
US-01 RF-01 RNF-01, RNF-02 desktop-swing/src/view/ Testado
US-02 RF-02 RNF-04, RNF-05 desktop-swing/src/model/ Testado
US-03 RF-03 RNF-01, RNF-03 desktop-swing/src/controller/ Testado
US-04 RF-04 RNF-01, RNF-02 desktop-swing/src/view/ Testado
US-05 RF-05 RNF-03, RNF-04 desktop-swing/src/test/ Testado

🏁 Checkpoints de Qualidade & Homologação

Checkpoint Escopo da Validação Artefato Verificado Status
CP-01 Estrutura de Diretórios & Dependências desktop-swing/ PASS ✅
CP-02 Modelagem de Domínio & Entidades Domain Models PASS ✅
CP-03 Interface de Usuário & Eventos View / Controller PASS ✅
CP-04 Recursos, Áudio & Estilização Assets & Configs PASS ✅
CP-05 Homologação com Suíte de Testes Test Suite PASS ✅