📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Especialização em Sistemas com Java (Swing/JavaFX). Recomendado revisar antes de começar.
v1.0 — Interfaces Desktop, Event Dispatch Thread (EDT), Layout Managers e MVC
Trilha de Especialização Pedagógica — Projeto 1 de 4
- ➡️ v1 (este): Interface Gráfica Desktop · Java Swing · MVC · EDT · ActionListeners
- v2: Sistema de Cadastro com JTable & Persistência JDBC
- v3: Interface Gráfica Moderna com JavaFX & CSS Styling
- v4: Jogo Blackjack (21) Profissional com JavaFX & Empacotamento Nativo (
jpackage)
🎓 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.
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).
“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.”
| 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 |
| 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 |
# 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
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));
}
}
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd javadesk_contador_01_swing
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`
+1 incrementa o contador e a mudança de cor ocorre ao atingir 101.O fluxo arquitetural abaixo detalha as camadas de interface, regras de negócio e homologação automatizada na subpasta desktop-swing/:
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
| 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 |
| 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 |
| 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 |
| 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 |
| 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 ✅ |