aplicação com leds

10 respostas
eloilton

estou fazendo uma aplicação para um transmissor de TV e preciso de algum componente que seja tipo um Led vermelho,pois preciso avisar o usuario quando há algum problema no transmissor!!!
vlw

10 Respostas

T

Se for Swing você pode adaptar o seguinte código. (Ele mostra um semáforo deitado e piscando, mas você pode aproveitar só o sinal vermelho.)

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

public class Semaforo extends JPanel {
    static enum Valores {
        VERMELHO, AMARELO, VERDE
    };
    
    /**
     * Indica se o farol está aceso ou apagado.
     */
    private boolean lit = true;
    private Timer timer  = new Timer (500, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            lit = !lit;
            repaint();
        }
    });
    
    /** Creates a new instance of Semaforo */
    public Semaforo() {
        super();
        setPreferredSize(new Dimension (80, 20));
        setOpaque(false);
        timer.start();
    }
    
    private Valores valor = Valores.VERMELHO;

    public Semaforo.Valores getValor() {
        return valor;
    }
    
    public void setValor (Semaforo.Valores pValor) {
        valor = pValor;
        repaint();
    }
    
    private Color red1 = new Color(255, 64, 64), red2 = new Color (128, 0, 0);
    private Color yellow1 = new Color (255, 255, 0), yellow2 = new Color (128, 128, 0);
    private Color green1 = new Color (128, 255, 128), green2 = new Color (0, 128, 0);
    private Paint[] gradients = new Paint[6]; //
    
    /** Cria um gradiente que simula iluminação vinda do canto superior esquerdo */
    private Paint getGradient (int n, int x, int y, int d, Color c1, Color c2) {
        if (gradients[n] == null) {
            double z = d * 0.35355339059327376220042218105242; // sqrt(2) / 4
            Point2D pt1 = new Point2D.Double(x + (d * 0.5 - z), y + (d * 0.5 - z));
            Point2D pt2 = new Point2D.Double(x + (d * 0.5 + z), y + (d * 0.5 + z));
            gradients[n] = new GradientPaint (pt1, c1, pt2, c2);
        }
        return gradients[n];
    }
    
    /**
     * Mostra o círculo vermelho, amarelo e verde. 
     * @param g O contexto gráfico.
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent (g);
        // Aqui devemos mostrar um círculo vermelho, amarelo e verde,
        // e pintar o interior do círculo adequado.
        // Obtendo o tamanho deste panel
        int w = this.getWidth();
        int h = this.getHeight();
        int pad = 3;
        // calculando o diâmetro de cada círculo
        int d = h - 2 * pad;
        // achando o ponto inicial para o primeiro círculo
        int x = w / 2 - (d + 2 * pad + d/2);
        int y = pad;
        
        Graphics2D g2d = (Graphics2D) g;
        g2d.setStroke (new BasicStroke (3.0f));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        
        if (valor == Valores.VERMELHO && lit)
            g2d.setPaint(getGradient (0, x, y, d, red1, red2));
        else
            g2d.setPaint(getGradient (1, x, y, d, red2, Color.BLACK));
        g2d.fillOval(x, y, d, d);
        
        x += d + pad * 2;
        if (valor == Valores.AMARELO && lit)
            g2d.setPaint(getGradient (2, x, y, d, yellow1, Color.BLACK));
        else
            g2d.setPaint(getGradient (3, x, y, d, yellow2, Color.BLACK));
        g2d.fillOval(x, y, d, d);
        
        x += d + pad * 2;
        if (valor == Valores.VERDE && lit)
            g2d.setPaint(getGradient (4, x, y, d, green1, Color.BLACK));
        else
            g2d.setPaint(getGradient (5, x, y, d, green2, Color.BLACK));
        g2d.fillOval(x, y, d, d);
    }
}
_Renatu

Uma vez precisei de uma aplicação com leds e usei JToggleButton com imagens, funcionou legal :lol:

eloilton

vlw mas preferi usar o panel…
mas estou com problemas na hora de trocar a cor da circunferencia!!!
ow thingow pode me dar uma dica?
vlw ae…

T

Existe um método nesse componente que permite a você trocar a luzinha acesa e piscando, de vermelha para amarela ou verde. O método é “setValor”, e aceita os valores:
Semaforo.Valores.VERMELHO, Semaforo.Valores.AMARELO, e Semaforo.Valores.VERDE.

Se você não gostou muito do tom de vermelho do semáforo, pode trocar uma das cores (red1 ou red2), veja a documentação de java.awt.Color para saber quais são os parâmetros adequados para as cores.

eloilton

ah sim… eh q tava dando erro com o enum e troquei por um objeto color e assim eu troco por um get tbm mas o repaint()
naum troca a cor, naum eh ele q “redesenha” o panel?

eloilton

o problema eh pq troquei a variável?

T

É melhor trocar o enum por uma constante inteira, se esse for o problema. Não use “Color” porque você teria de usar “equals” em vez de “==” onde você tem:

if (valor == Valores.AMARELO…)

eloilton

olha eu tentei adaptar seu código para usar apenas um circulo, pq eh a minha necessidade então nessa linha de código eu seto o valor da cor como vc fez mas somente estou conseguindo ajustar uma vez, pois quando utilizo o setColor, não altera a cor pois eu preciso redesenhar a cinrcunferencia, ok?
mas exatamente nesse detalhe meus conceitos estaum falhando

g2d.setPaint(getGradient (0, x, y, d, color, color));

T

Dica: se estiver muito difícil, use um JLabel (que permite mostrar imagens também) e use 2 (ou mais) imagens, uma para cada cor que você precisa. Para mudar do jeito que você quer, é melhor jogar fora um monte de coisas, e fazer do zero (aproveitando as idéias é claro).

eloilton

:smiley:
vlw kra, eu achei interessante o jeito de q vc fez a classe semáforo, fiz algumas modificações mas resolvi abortar, e vou ficar com o JLabel msm pois eu preciso de alertar um alarme então como apenas recebo esse alarme e não fico monitorando, apenas passo essa informação ao operador, eh melhor setar as imagens msm…
vlw a dica pois c resume em apenas uma linha neh…
abraços t+ :smiley: :smiley:

Criado 23 de janeiro de 2007
Ultima resposta 24 de jan. de 2007
Respostas 10
Participantes 3