Como preencher um array dinâmico num applet?

Pessoal to com um seguinte problema. Não estou conseguindo preencher um array de posição dinâmica pegando os valores do TextField do applet. Por favor me ajudem… olha o código abaixo…

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Graficobarras extends Applet implements ActionListener
{
    int i,cor,qtdbarra,count;
    TextField barras = new TextField (5); //quantidade de barras que o gráfico vai ter
    TextField valorbarra = new TextField(5); //entrada dos valores
    Button qtdbarras = new Button();
    Button valorbarrasx=new Button();
    Button gerargrafico=new Button();
    int[] vForma = new int [i];
           
    public void actionPerformed (ActionEvent e)
    {
    	String buttonCommand = e.getActionCommand();
    	if (buttonCommand.equals("Qtde de Barras"))
		{
			qtdbarra = Integer.parseInt(barras.getText());
			qtdbarras.setEnabled (false);
		}
  	  	
  	  	if (buttonCommand.equals("Valores das Barras"))
		{	
			if (count<=qtdbarra)
			{
				do
				{
					vForma[i] = Integer.parseInt(valorbarra.getText());
					i=i++;
					valorbarra.setText("");
				}while (i<=qtdbarra);
			}
			count=count+1;
			if (count==qtdbarra)
			{
				valorbarra.setEnabled (false);
			}			
		}
		if (buttonCommand.equals("Gerar Grafico"))
		{
			repaint();	
		}
    } 
    	
	public void init()
    {
       	Label l1 = new Label("Quantidade de Barras:");
       	add(l1);
       	
       	add(barras); //adiciona o TextField da quantidade de barras
        
        qtdbarras.setLabel("Qtde de Barras"); //label do botão da quantidade de barras que o gráfico vai ter
        add(qtdbarras);//adiciona o botão da quantidade de barras
        qtdbarras.addActionListener(this);
              
        Label l2 = new Label ("Digite os valores das barras:");
        add(l2);
        
        add(valorbarra); //adiciona o TextField dos valores
       	
       	valorbarrasx.setLabel("Valores das Barras");
        add(valorbarrasx); ////adiciona o botão da quantidade de valores do gráfico
        valorbarrasx.addActionListener(this);
        
        //adiciona o botão para gerar o gráfico.
       	gerargrafico.setLabel("Gerar Grafico");
        add(gerargrafico);
        gerargrafico.addActionListener(this);
        
        count=0;
     }
    public void paint(Graphics g)
    {
    		g.setColor(Color.white);
            g.fillRect(0, 0, 300, 400);
            for(i=0; i<=qtdbarra; i++)
           	{
           		cor=(int)(Math.random()*16000000);
	       		g.setColor (new Color(cor));
 	      		g.fillRect (i,i,25,vForma[i]);
 	      	}  	    	    
 	}  
}

Código do HTML…

<html>
<head>
<title>Aula de Applet Java </title>
</head>
<body>
<applet code="Graficobarras.class" width=900 height=550>
</applet>
</body>
</html>

Pois ele tem que pegar os valores do TextField e guardar num array… Conseguiram entender?

Por favor que conseguir me dá uma dica entre em contato comigo draconfla@yahoo.com.br… Ok… Obrigado…

Bom… isso aqui é esquisito:

i=i++;
Cê tá jogando no i o valor do próprio i, depois (por causa do ++) incrementando o i. Faça simplesmente:

i++;
Você pode fazer o mesmo para o count, ao invés de:

count=count+1;
Dá para fazer

count++;

[quote=Fox McCloud]Bom… isso aqui é esquisito:

i=i++;
Cê tá jogando no i o valor do próprio i, depois (por causa do ++) incrementando o i. Faça simplesmente:

i++;
Você pode fazer o mesmo para o count, ao invés de:

count=count+1;
Dá para fazer

count++;[/quote]

Valeu cara vou tentar aqui…Não tinha visto isso no código

Outra coisa, isso aqui nunca vai funcionar:

int i; int[] vForma = new int [i];
i é uma variável de instância, ou seja, quando essa classe é instanciada i passa a valer 0. Então logo abaixo você criará um vetor de tamanho zero. Ponha simplesmente:

int i; int[] vForma;
E inicialize o vetor apenas quando você já tiver o i (já souber qual será o tamanho do seu vetor).

vForma = new int[i];
Tem mais alguns detalhes… quando você faz:

g.fillRect (i,i,25,vForma[i]);
Você está colocando como sendo i a posição x e y do retângulo. Então se i for incrementado o retângulo irá se deslocar diagonalmente. Esse comando funciona assim:

g.fillRect (posX,posY,largura,altura);
Calcule o posY de forma que os seus retângulos sejam alinhados por baixo. Esse cálculo vai depender da altura deles. Lembre-se que em computação gráfica 2D a origem é o canto superior esquerdo do monitor, então conforme você aumenta o x a figura vai para a direita, e conforme você aumenta o y a figura desce.

Aproveitando a deixa: use nomes de variáveis com algum significado, tem muito i nesse programa, ficará mais fácil se você sempre souber onde está mexendo. Exatamente como eu mostrei acima: posX, posY, largura, altura…

Faz assim: me manda o seu applet (anexa ele) e me explica melhor o que você quer e eu farei um applet funcional pra te ensinar.

Aí cara o Applet junto com o codigo do HTML… De uma olhada pra mim… agradeço desde já…

Vou olhar, mas me explique direitinho o que você quer que esse Applet faça!

quero o seguinte…

O usuário vai digitar num texfield a quantidade de barrasque vai ter o gráfico. Em um outro textfiled o usuário vai digitar os valores que vai fazer as barras, isso é, quando ele digitar os valores, o gráfico vai ter o tamanho do valor que ele digitou. E esses valores eu to querendo jogar dentro de um vetor para guardar os valores para fazer as barras. E depois disso chamar o método paint para desenhar o gráfico com os valores que foi digitado no vetor…

Entendeu? Se não me add no msn que eu te explico… msn: draconfla@yahoo.com.br … Ok… agradeço desde já…

Ok, eu entendi.
Detalhe: para que haja uma medida para as barras eu vou considerar que o maior valor inserido será o 100%, assim as barras indicarão valores relativos ao 100%. Outra coisa: não é preciso indicar em outro campo quantas barras serão, a quantidade de valores já vai indicar isso. Agora güenta aí que eu vou fazer… pode demorar um pouco.

[quote=Fox McCloud]Ok, eu entendi.
Detalhe: para que haja uma medida para as barras eu vou considerar que o maior valor inserido será o 100%, assim as barras indicarão valores relativos ao 100%. Outra coisa: não é preciso indicar em outro campo quantas barras serão, a quantidade de valores já vai indicar isso. Agora güenta aí que eu vou fazer… pode demorar um pouco.[/quote]

Ok agradeço… se vc me mandar ainda hj… agradeço pela eternidade… rsrs…

Ufa! Está pronto!
Güenta aí que estou colocando no ar.
Demorou um pouco porque estou no trabalho!
:smiley:

[quote=Fox McCloud]Ufa! Está pronto!
Güenta aí que estou colocando no ar.
Demorou um pouco porque estou no trabalho!
:smiley: [/quote]

To aguardando…brigadão mesmo… Te devo essa pelo resto da vida…rsrs… :roll:

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! :wink:

po cara valeu mesmo agora vou estudar esse codigo pra eu enteder…rsr. valeu mesmo…Brigadão

Ok.

Não se preocupe muito com o código da interface gráfica (na classe JanelaPrincipal), eu usei o Visual Editor do Eclipse para inserir, posicionar e personalizar os elementos. O código importante começa no método MouseClicked() da classe interna privada Listener().

O mais importante é a lógica, e como usei orientação a objetos essa lógica deve estar simples de enxergar.

Cara… valeu pela sua dica… aí… agradeço mesmo…

Bom conseguir fazer a parada da inserção dos dados pelo meu código mesmo… de uma olhada… rsr…

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Graficobarras extends Applet implements ActionListener
{
    int i,cor,qtdbarra,count;
    TextField barras = new TextField (5); //quantidade de barras que o gráfico vai ter
    TextField valorbarra = new TextField(5); //entrada dos valores
    Button qtdbarras = new Button();
    Button valorbarrasx=new Button();
    Button gerargrafico=new Button();
    int []vForma;
            
    public void actionPerformed (ActionEvent e)
    {
    	String buttonCommand = e.getActionCommand();
    	if (buttonCommand.equals("Qtde de Barras"))
		{
			qtdbarra = Integer.parseInt(barras.getText());
			i=qtdbarra;
			vForma = new int [qtdbarra];
			barras.setEnabled (false);
			qtdbarras.setEnabled (false);
			valorbarrasx.setEnabled (true);
			valorbarra.setEnabled (true);
		}
  	  	
  	  	if (buttonCommand.equals("Valores das Barras"))
		{	
			i=0;
			if (count<=qtdbarra)
			{
				vForma[i] = Integer.parseInt(valorbarra.getText());
				i++;
				valorbarra.setText("");
			}
			count++;
			if (count==qtdbarra)
			{
				valorbarra.setEnabled (false);
				valorbarrasx.setEnabled (false);
				gerargrafico.setEnabled (true);
			}			
		}
		if (buttonCommand.equals("Gerar Grafico"))
		{		
		  paint();	
		}
    } 
    	
	public void init()
    {
       	Label l1 = new Label("Quantidade de Barras:");
       	add(l1);
       	
       	add(barras); //adiciona o TextField da quantidade de barras
        
        qtdbarras.setLabel("Qtde de Barras"); //label do botão da quantidade de barras que o gráfico vai ter
        add(qtdbarras);//adiciona o botão da quantidade de barras
        qtdbarras.addActionListener(this);
              
        Label l2 = new Label ("Digite os valores das barras:");
        add(l2);
        
        add(valorbarra); //adiciona o TextField dos valores
       	
       	valorbarrasx.setLabel("Valores das Barras");
        add(valorbarrasx); ////adiciona o botão da quantidade de valores do gráfico
        valorbarrasx.addActionListener(this);
        
        //adiciona o botão para gerar o gráfico.
       	gerargrafico.setLabel("Gerar Grafico");
        add(gerargrafico);
        gerargrafico.addActionListener(this);
               
        count=0;
        
        valorbarra.setEnabled (false);
		valorbarrasx.setEnabled (false);
		gerargrafico.setEnabled (false);
    }
    public void paint(Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(0, 0, 300, 400);
        for(i=0; i<=qtdbarra; i++)
       	{
       		cor=(int)(Math.random()*16000000);
       		g.setColor (new Color(cor));
      		g.fillRect (i,i,25,vForma[i]);
      	}
    }  	    	    
}

Mas é o seguinte… eu quero chamar o método paint de dentro do botão “Gerar o Gráfico” como que faz?

Pois tentei o paint(); e não deu certo… pode me ajudar?

O método paint que você herda da classe JApplet e sobrescreve (abaixo, veja).

public void paint(Graphics g){ // ... }
É chamado, na verdade, pela própria JVM (máquina virtual) para desenhar a tela. Quando a JVM chama esse método, ela fornece a ele um objeto g do tipo Graphics, que é a sua conexão com as ferramentas para desenhar, o seu acesso indireto ao hardware de vídeo. Se você chamar paint() por conta própria, não terá um objeto do tipo Graphics para fornecer para o seu método desenhar.

Então, respondendo à sua pergunta: use repaint(). O repaint() dirá à JVM: “ei, chame o paint() e passe um objeto Graphics a ele”. Usando repaint() você fará a JVM chamar o seu paint().

É legal mesmo você desenvolver o seu próprio código e ver o que acontece quando ele roda, assim poderá ter uma idéia bem mais clara do que está acontecendo e, aos poucos, juntar as peças do quebra-cabeças.
:wink:

[quote=Fox McCloud]O método paint que você herda da classe JApplet e sobrescreve (abaixo, veja).

public void paint(Graphics g){ // ... }
É chamado, na verdade, pela própria JVM (máquina virtual) para desenhar a tela. Quando a JVM chama esse método, ela fornece a ele um objeto g do tipo Graphics, que é a sua conexão com as ferramentas para desenhar, o seu acesso indireto ao hardware de vídeo. Se você chamar paint() por conta própria, não terá um objeto do tipo Graphics para fornecer para o seu método desenhar.

Então, respondendo à sua pergunta: use repaint(). O repaint() dirá à JVM: “ei, chame o paint() e passe um objeto Graphics a ele”. Usando repaint() você fará a JVM chamar o seu paint().

É legal mesmo você desenvolver o seu próprio código e ver o que acontece quando ele roda, assim poderá ter uma idéia bem mais clara do que está acontecendo e, aos poucos, juntar as peças do quebra-cabeças.
:wink: [/quote]

É eu pensei nisso mesmo. Chamar o Rapint();
rsrs

valeu cara brigadão…