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
aplicação com leds
10 Respostas
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);
}
}
Uma vez precisei de uma aplicação com leds e usei JToggleButton com imagens, funcionou legal :lol:
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…
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.
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?
o problema eh pq troquei a variável?
É 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…)
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));
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).

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+
