Esse código é compatível com Java 1.4 e foi desenvolvido com 5 classes (sem contar a classe interna privada Listener), sendo que o Applet, em si, é a classe JanelaPrincipal.
Em primeiro lugar o arquivo mais simples, a interface constantes, usada em alguns lugares do programa:
[code]
public interface Constantes {
// em uma interface toda variável é implicitamente public static final.
// largura da telinha que conterá o gráfico
int LARGURA_TELA_BARRAS = 390;
// altura da telinha que conterá o gráfico
int ALTURA_TELA_BARRAS = 250;
// largura de cada barra
int LARGURA_BARRA = 30;
// espaço entre as barras
int ESPACO = 5;
}[/code]
A classe JanelaPrincipal contém todo o layout da aplicação, uma classe interna MouseListener para tratar dos eventos, uma classe JanelaBarras, que é a “tela” onde os gráficos aparecem, e uma instância da classe BarrasManager, que cuida das barras em si. O que ela faz é capturar os cliques do mouse no botão Inserir, colocar o valor no “vetor” e atualizar a exibição (mostrando o conteúdo do “vetor” e dando um repaint() na janela das barras). Eu coloquei vetor entre aspas porque utilizei uma LinkedList, o que é muito mais fácil (já que não tem tamanho fixo), mas esse código é facilmente modificável se for imprescindível usar um vetor.
[code]
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JApplet;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
public class JanelaPrincipal extends JApplet {
private JPanel painel = null;
private JPanel janelaBarras = null;
private JTextField campoVetor = null;
private JTextField campoEntrada = null;
private JButton botaoInserir = null;
private JLabel rotulo = null;
private JanelaPrincipal instancia;
// Variáveis da lógica da solução
private Listener mouseListener;
private BarrasManager barrasManager;
/**
* This method initializes
*
*/
public JanelaPrincipal() {
super();
mouseListener = new Listener();
instancia = this;
barrasManager = new BarrasManager();
}
/**
* This method initializes this
*
*/
public void init() {
this.setSize(new java.awt.Dimension(400,316));
this.setContentPane(getPainel());
}
/**
* This method initializes painel
*
* @return javax.swing.JPanel
*/
private JPanel getPainel() {
if (painel == null) {
rotulo = new JLabel();
rotulo.setBounds(new java.awt.Rectangle(300,265,90,16));
rotulo.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
rotulo.setText("Vetor de Dados:");
painel = new JPanel();
painel.setLayout(null);
painel.setPreferredSize(new java.awt.Dimension(10,10));
painel.add(getTela(), null);
painel.add(getCampoVetor(), null);
painel.add(getCampoEntrada(), null);
painel.add(getBotaoInserir(), null);
painel.add(rotulo, null);
}
return painel;
}
/**
* This method initializes tela
*
* @return javax.swing.JPanel
*/
private JPanel getTela() {
if (janelaBarras == null) {
janelaBarras = new JanelaBarras(barrasManager);
janelaBarras.setLocation(new java.awt.Point(5,5));
janelaBarras.setSize(new java.awt.Dimension(Constantes.LARGURA_TELA_BARRAS,Constantes.ALTURA_TELA_BARRAS));
janelaBarras.setBackground(java.awt.Color.black);
}
return janelaBarras;
}
/**
* This method initializes campoVetor
*
* @return javax.swing.JTextField
*/
private JTextField getCampoVetor() {
if (campoVetor == null) {
campoVetor = new JTextField();
campoVetor.setBounds(new java.awt.Rectangle(5,291,390,20));
campoVetor.setEditable(false);
}
return campoVetor;
}
/**
* This method initializes campoEntrada
*
* @return javax.swing.JTextField
*/
private JTextField getCampoEntrada() {
if (campoEntrada == null) {
campoEntrada = new JTextField();
campoEntrada.setBounds(new java.awt.Rectangle(5,264,60,20));
}
return campoEntrada;
}
/**
* This method initializes botaoInserir
*
* @return javax.swing.JButton
*/
private JButton getBotaoInserir() {
if (botaoInserir == null) {
botaoInserir = new JButton();
botaoInserir.setBounds(new java.awt.Rectangle(70,260,71,26));
botaoInserir.setText("Inserir");
botaoInserir.addMouseListener(mouseListener);
}
return botaoInserir;
}
private class Listener implements MouseListener{
public void mouseClicked(MouseEvent e) {
if(e.getSource()==botaoInserir){
int numero = 0;
try{
numero = Integer.parseInt(campoEntrada.getText());
}
catch(NumberFormatException ex){
JOptionPane.showMessageDialog(instancia,"Insira apenas números inteiros.","Erro",JOptionPane.ERROR_MESSAGE);
return;
}
barrasManager.addBarra(numero);
campoVetor.setText(barrasManager.toString());
janelaBarras.repaint();
}
}
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
}[/code]
A classe JanelaBarras é o JPanel onde aparecerão as barras desenhadas (a telinha preta). Ela é bem simples, tem uma referência para o BarrasManager, e o que ela faz é chamar o paint() do BarrasManager, que vai fazer cada barra se desenhar na tela. Eu também sobrecarreguei o método public void update(Graphics g) de forma a impedir o flickering no redesenho da tela.
[code]
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class JanelaBarras extends JPanel{
private BarrasManager barrasManager;
public JanelaBarras(BarrasManager barrasManager){
this.barrasManager = barrasManager;
}
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillRect(0,0,getWidth(),getHeight());
barrasManager.paint(g);
}
public void update(Graphics g){
paint(g);
}
}[/code]
A classe Barra é um objeto que contém o seu valor numérico e a sua cor, além de um método paint() para se pintar na tela, recebendo detalhes de como fazer isso da classe que o chama, a classe BarrasManager.
A classe BarrasManager contém uma LinkedList de Barras , um paint() que percorre a lista chamando o paint() de cada barra, um addBarra(), que recebe um número e cria uma nova Barra com esse número, recalculando em seguida a altura máxima de uma barra através do maior número da lista, e o tamanho das outras barras baseia-se nesse máximo. Se você inserir um número maior ou menor o tamanho de todas as barras será recalculado. Contém também um método toString() que devolve uma String que mostra o valor numérico das barras.
[code]
import java.awt.Color;
import java.awt.Graphics;
public class Barra {
private int numero;
private Color cor;
public Barra(int numero){
this.numero = numero;
cor = Color.WHITE;
}
public void paint(Graphics g,int posX,int altura){
g.setColor(cor);
g.fillRect(posX,Constantes.ALTURA_TELA_BARRAS-altura,Constantes.LARGURA_BARRA,altura);
}
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public Color getCor() {
return cor;
}
public void setCor(Color cor) {
this.cor = cor;
}
}[/code]
[code]
import java.awt.Graphics;
import java.util.Iterator;
import java.util.LinkedList;
public class BarrasManager {
private LinkedList barras;
private int maximo;
public BarrasManager(){
barras = new LinkedList();
maximo = 0;
}
public void addBarra(int numero){
barras.addLast(new Barra(numero));
calculaMaximo();
}
public void paint(Graphics g) {
Iterator i = barras.iterator();
for(int numBarras = 0;i.hasNext();numBarras++){
Barra barra = (Barra)i.next();
barra.paint(g,5+Constantes.LARGURA_BARRA*numBarras+5*numBarras,calculaAltura(barra.getNumero()));
}
}
private void calculaMaximo(){
Iterator i = barras.iterator();
while(i.hasNext()){
maximo = Math.max(maximo,(int)(((Barra)i.next()).getNumero()));
}
}
private int calculaAltura(int numero){
return (int)((numero*(Constantes.ALTURA_TELA_BARRAS-5))/maximo);
}
public String toString(){
Iterator i = barras.iterator();
StringBuffer vetor = new StringBuffer();
while(i.hasNext()){
vetor.append((vetor.length()!=0?", ":"")+String.valueOf(((Barra)i.next()).getNumero()));
}
return vetor.toString();
}
}[/code]
Esse programa é bem funcional, é só rodar o Applet JanelaPrincipal para entender facilmente como utilizar e os resultados gerados, e modificando a interface Constantes é fácil reconfigurá-lo, embora eu não recomende mudar a altura e a largura da tela de barras, nem brincar com números negativos e coisas assim, afinal isso é só um exemplo, e não um software comercial com todas as possibilidades previstas.
Aproveite, espero que você estude esse código pra te ajudar, tire mais dúvidas se quiser e me dê uma classificação pela ajuda (huahuahua)!
8)
Falow! Boa sorte! 