JTable KI RAIVA!

17 respostas
lina

Amigos,
desculpem o palavrão.. mais é uma merda mexer com JTable!
estou irritada!!!!

assim, estou tentando fazer uma pilha, só que meu problema é que já consegui fazer com JOption, porem quero em um JFuckingTable...

quando eu clico no inserir, ele esta inserindo corretamente, segue o código:

// Informações para a tabela.
String[][] dados = new String [1][1];
	 		 
String[] colunas = new String []{"Valores"};
	 			 
// adiciona o elemento.
stack.push(io_tf_inserir.getText());	 			
	 			
// Cria um contador.
Enumeration enumeration = stack.elements();	 			
	 			
// Cria a string a ser armazenada.
//StringBuffer buffer = new StringBuffer();
	 	        
// enquanto tiver elemento.
while (enumeration.hasMoreElements()){	 				
//buffer.append(enumeration.nextElement());	 				
	dados[0] = new 	String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};	 		}
	 			
// Cria a tabela.	 		
io_tb_tabela = new JTable(dados,colunas);
io_sp_tabela = new JScrollPane(io_tb_tabela);
io_sp_tabela.setBounds(5, 100, 415, 200);	 		
io_ct.add(io_sp_tabela);

porem quando eu digito uma vez, ele faz certo... mais já na segunda ele não esta mostrando o valor, pois estou adicionando no mesmo lugar! essa linha ó:

dados[0] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};

.. ele insere na mesma posição [0]. como eu faço para ele criar outra linha com o valor novo?!?! não sei como fazer isso... desculpem minha maneira de falar..
mais ja to enxendo com isso.. eu quero digitar novos valores, e toda vez q eu digitar a lista do JTable vai descendo.. criando uma nova linha..

na real, tenho que fazer um contador.. mais cara.. me ajudem.. é tosca.. mais ajuda ai!

Obrigado!
Tchauzin!

17 Respostas

Romeo

vc colocou dados[0], ai esta o erro, vc precisa incrementar

lina

Poisé
eu vi e mostrei grifado que o problema era esse…
porem na hora de incrementar ocorre ArrayIndexOut… e não consigo descubrir porque…

alguem tem ideia de como faço para incrmentar corretamente?

=*

Tchauzin!

Mauricio_Linhares

Com um for:

for ( int x = 0; enumeration.hasMoreElements(); x++ ) {
        	dados[x] = new 	String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};
        }
gcobr

Aprenda a implementar a interface TableModel e entenda como o JTable funciona.

Impossível ter problemas.

Seu problema é mau uso.

lina

Não funciona...

já tentei:

// enquanto tiver elemento.
while (enumeration.hasMoreElements())
{						 				
	dados[contador] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};
}

e assim:

for (int x =0; enumeration.hasMoreElements(); x++){ 				
 						 				
 					dados[x] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};
}

e assim:

for (int x =0; enumeration.hasMoreElements(); x++)
{		 				
	dados[x] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};		
x++;
break;
}

ele faz, sem erros.. mais não acrescenta nenhum linha...

Vo coloca a minha classe teste ai.. se alguem conseguir,
não sabe o quanto eu agradeceria.

Tchauzin!

Não sei como anexar.. código inteiro abaixo:

//
// Pacote ao qual a classe pertence
//
package trabalho_pilha;

//
//Importa as bibliotecas Java
//
//import			;
import java.awt.Container;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.util.Enumeration;
import java.util.Stack;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;

public class teste extends JFrame {
	
	// Variaveis de trabalho.
	public Container io_ct;
	public JTable io_tb_tabela;
	public JButton io_bt_inserir, io_bt_excluir, io_bt_top, io_bt_limpar, io_bt_fechar;
	public JScrollPane io_sp_tabela;
	public JTextField io_tf_inserir;
	public JLabel io_lb_string;
	public Stack stack;
	public int contador = 0;
	
	public teste() {
		setTitle("Pilha");
		setBounds(200,200,433,380);
		setResizable(false);
		WindowGUI();
	}

	public void WindowGUI(){
		
		// Cria o container e define o Layout a ser usado
		io_ct = getContentPane();
		getContentPane().setLayout(null);
		
		// instancia o stack.
		stack = new Stack();
		
		// Cria o botão de inserir o elemento na pilha.
		io_bt_inserir = new JButton(io_ie_tabela);
		io_bt_inserir.setText("Inserir");
		io_bt_inserir.setBounds(210,10,100,25);
		io_ct.add(io_bt_inserir);
		
		// Cria o botão excluir.
		io_bt_excluir = new JButton();
		io_bt_excluir.setText("Excluir");
		io_bt_excluir.setBounds(320,10,100,25);
		io_ct.add(io_bt_excluir);
		
		// Cria o botão topo.
		io_bt_top = new JButton();
		io_bt_top.setText("Topo");
		io_bt_top.setBounds(210,40,100,25);
		io_ct.add(io_bt_top);
		
		// Limpa a pilha.
		io_bt_limpar = new JButton();
		io_bt_limpar.setText("Limpa");
		io_bt_limpar.setBounds(320,40,100,25);
		io_ct.add(io_bt_limpar);
		
		// Cria o label do textfield.
		io_lb_string = new JLabel("Valor: ",SwingConstants.RIGHT);
		io_lb_string.setBounds(0,10,50,25);
		io_ct.add(io_lb_string);
		
		// Cria o textfield, para digitar os elementos.
		io_tf_inserir = new JTextField();
		io_tf_inserir.setBounds(55,10,150,25);
		io_ct.add(io_tf_inserir);
	}
	
	/**
	  * Ação quando clicado em "Fechar".
	  */
	 Action
	 io_ie_fechar	=	new	AbstractAction()
	 {
	 	public void actionPerformed(ActionEvent e)
	 	{
	 		// Fecha o programa.
	 		dispose();
		}	 	
	 };
	
	/**
	  * Ação quando clicado em "Inserir".
	  */
	 Action
	 io_ie_tabela	=	new	AbstractAction()
	 {
	 	public void actionPerformed(ActionEvent e)
	 	{
	 		// Se o campo for diferente de vazio.
	 		if (io_tf_inserir.getText().length() > 0){
	 			
	 			// Informações para a tabela.
	 			String[][] dados = new String [100][100];
	 		 
	 			String[] colunas = new String []{"Valores"};
	 			 
	 			// adiciona o elemento.
	 			stack.push(io_tf_inserir.getText());	 			
	 			
	 			// Cria um contador.
	 			Enumeration enumeration = stack.elements();	 			
	 				 				 			
//	 			// enquanto tiver elemento.
//	 			while (enumeration.hasMoreElements()){
	 				
 					for (int x =0; enumeration.hasMoreElements(); x++){ 				
 						 				
 					dados[x] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};
 					}
	 					
//	 			}
	 			
	 			// Cria a tabela.	 		
		 		io_tb_tabela = new JTable(dados,colunas);
		 		io_sp_tabela = new JScrollPane(io_tb_tabela);
		 		io_sp_tabela.setBounds(5, 100, 415, 200);	 		
		 		io_ct.add(io_sp_tabela);
		 		
		 		// Cria o botão fecha.
				io_bt_fechar = new JButton(io_ie_fechar);
				io_bt_fechar.setBounds(325,310,95,25);
				io_bt_fechar.setText("Fechar");
				io_ct.add(io_bt_fechar);
				
				// Repinta o container.
				io_ct.repaint();
	 		}
	 		else {
	 			JOptionPane.showMessageDialog(null, "Valor não pode estar vazio");
	 		}
		}	 	
	 };
	 
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
	
	// Decora a janela.
	JDialog.setDefaultLookAndFeelDecorated(true);
	JFrame.setDefaultLookAndFeelDecorated(true);
	
	// Executa o programa.
        JFrame frame = new teste();
        frame.show();
    }
}
Romeo

String[][] dados = new String [100][100];

dados[x] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};

Se vc declarou dados[][] precisa corresponder na hora de inserir não?

lina

estou correspondendo…
aquele array [100][100] esta colocando 100 linhas…
e idependente da quantidade de elementos que eu coloco só mostra 1…
1 linha preenxida… sobrando 99…

Romeo

é aqui lina
[color=green]dados[x] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};[/color]

tinha q ser algo do tipo

[color=green]dados[x][[size=18]y[/size]] = new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()};[/color]

fmeyer

Por favor crie/edite seu topico pra fazer sentido com oque voce esta escrevendo.

Mantu

Na verdade, o problema principal é que a cada clique do botão inserir o seu programa “mata” a JTable existente e coloca outra “nova” (new) no lugar. Esse é o grande problema… Cada vez que é executada a Action que você atribuiu ao botão, você instancia uma nova JTable. È por isso que você tem a impressão de ter sempre uma linha apenas: por que a cada clique, é uma nova tabela que está sendo exibida.
Creio que você deverá recorrer a uma solução utilizando um TableModel. É meio chatinho pra aprender, mas depois, vc não quer mais outra coisa pra mexer com JTable

lina

Bom,
eu tentei fazer [x][Y] porem não deu certo igual...
pensei nessa de dar new o tempo todo também... mais cara!.. eu já sei utilizar a Tablemodel, e já tenho uma pronto.. o problema é que continua igual.. eu passo um Array pra ela agora... e tipo, o primeiro valor é colocado.. mas o segundo não, fica a mesma linha e o mesmo valor!!!
então, claro que o problema do new não pode ser.. se não, ele ao menos ia mudar o valor da linha para o segundo.. concorda?

// Informações para a tabela.
ArrayList dados = new ArrayList();
	 		 
// Cria a coluna.
String[] colunas = new String []{"Valores"};
	 			
// Cria a mascara de edição.
boolean [] edicao = {false, true};
	 			 
// adiciona o elemento.
stack.push(io_tf_inserir.getText());	 			
	 			
// Cria um contador.
Enumeration enumeration = stack.elements();
				
// recebe os dados.
dados.add(new String[]{io_tf_inserir.getText(),(String)enumeration.nextElement()});
				
// cria o modelo.
SimpleTableModel modelo = new SimpleTableModel(dados, colunas, edicao);
				
// Cria a tabela.	 		
io_tb_tabela = new JTable(modelo);
io_sp_tabela = new JScrollPane(io_tb_tabela);		 		
		 		io_tb_tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
io_sp_tabela.setBounds(5, 100, 415, 200);	 		
io_ct.add(io_sp_tabela);
Mantu

Como eu disse antes, o problema é que você cria uma nova tabela a cada clique no botão, fazendo com que toda e qualquer inserção seja sempre a primeira inserção…

clodoaldoaleixo

Você pode até já saber utilizar o TableModel, mas o colega Mantu se refere ao código que você postou aqui, e nesse código, concordo com ele(Mantu), você cria a cada clique no botão uma nova instância de um JTable.

Mantu
Fiz uma pequena e simples correção, nada muito sofisticado. Acho que dá pra clariar mais ou menos a ideia em torno deste problema.
/**
 * @author Mantu
 */
package help.guj.lina;

//
// Importa as bibliotecas Java
//
// import ;
import java.awt.Container;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.util.Enumeration;
import java.util.Stack;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;

public class teste extends JFrame {

	// Variaveis de trabalho.
	public Container io_ct;
	public JTable io_tb_tabela;
	public JButton io_bt_inserir, io_bt_excluir, io_bt_top, io_bt_limpar,
			io_bt_fechar;
	public JScrollPane io_sp_tabela;
	public JTextField io_tf_inserir;
	public JLabel io_lb_string;
	public Stack stack;
	public int contador = 0;

	public teste() {
		setTitle("Pilha");
		setBounds(200, 200, 433, 380);
		setResizable(false);
		WindowGUI();
	}

	public void WindowGUI() {

		// Cria o container e define o Layout a ser usado
		io_ct = getContentPane();
		getContentPane().setLayout(null);

		// instancia o stack.
		stack = new Stack();

		// Cria o botão de inserir o elemento na pilha.
		io_bt_inserir = new JButton(io_ie_tabela);
		io_bt_inserir.setText("Inserir");
		io_bt_inserir.setBounds(210, 10, 100, 25);
		io_ct.add(io_bt_inserir);

		// Cria o botão excluir.
		io_bt_excluir = new JButton();
		io_bt_excluir.setText("Excluir");
		io_bt_excluir.setBounds(320, 10, 100, 25);
		io_ct.add(io_bt_excluir);

		// Cria o botão topo.
		io_bt_top = new JButton();
		io_bt_top.setText("Topo");
		io_bt_top.setBounds(210, 40, 100, 25);
		io_ct.add(io_bt_top);

		// Limpa a pilha.
		io_bt_limpar = new JButton();
		io_bt_limpar.setText("Limpa");
		io_bt_limpar.setBounds(320, 40, 100, 25);
		io_ct.add(io_bt_limpar);

		// Cria o label do textfield.
		io_lb_string = new JLabel("Valor: ", SwingConstants.RIGHT);
		io_lb_string.setBounds(0, 10, 50, 25);
		io_ct.add(io_lb_string);

		// Cria o textfield, para digitar os elementos.
		io_tf_inserir = new JTextField();
		io_tf_inserir.setBounds(55, 10, 150, 25);
		io_ct.add(io_tf_inserir);
		
		/*
		 * Instancia a tabela associando a ela uma DefaultTableModel
		 */
		io_tb_tabela = new JTable();
		
		io_sp_tabela = new JScrollPane(io_tb_tabela);
		io_sp_tabela.setBounds(5, 100, 415, 200);
		io_ct.add(io_sp_tabela);
	}

	/**
	 * Ação quando clicado em "Fechar".
	 */
	Action io_ie_fechar = new AbstractAction() {
		public void actionPerformed(ActionEvent e) {
			// Fecha o programa.
			dispose();
		}
	};

	/**
	 * Ação quando clicado em "Inserir".
	 */
	Action io_ie_tabela = new AbstractAction() {
		public void actionPerformed(ActionEvent e) {
			// Se o campo for diferente de vazio.
			if(io_tf_inserir.getText().length() > 0) {

				// Informações para a tabela.
				/* A SUA TABELA PODE, SIM, TER 100, 1000, 10000 LINHAS, MAS TEM
				 * APENAS 1 COLUNA
				String[][] dados = new String[100][100];
				 *O CERTO MESMO SERIA ENTÃO
				String[][] dados = new String[100][1];
				 *MAS, WHO CARES.... VOCÊ VERÁ QUE NÃO VAMOS PRECISAR DESSE 
				 *VETOR dados...
				*/

				String[] colunas = new String[] {
					"Valores"
				};

				// adiciona o elemento.
				stack.push(io_tf_inserir.getText());

				/*
				 * TableModel para nossa tabela. 
				 * Ele terá 0 linhas por enquanto...
				 */
				DefaultTableModel dtm = new DefaultTableModel(
					colunas, 
					0
				);
				// Cria um contador.
				Enumeration enumeration = stack.elements();

				/* O FOR NÃO É UMA BOA ESCOLHA... O WHILE É MELHOR...
				// // enquanto tiver elemento.
				// while (enumeration.hasMoreElements()){

				for (int x = 0; enumeration.hasMoreElements(); x++) {

					dados[x] = new String[] {
						io_tf_inserir.getText(),
						(String) enumeration.nextElement()
					};
				}

				// }
				*/
				while(enumeration.hasMoreElements()) {
					/*
					 * Vomos adiciona uma linha ao nosso dtm. Para um TableModel,
					 * uma linha é um vetor de objetos Object. Cada posição deste 
					 * vetor deve corresponder a um campo do TableModel.
					 * No nosso caso temos apenas um campo e, logo, o nosso vetor
					 * terá apenas uma posição.
					 */
					Object[] linha = {enumeration.nextElement()};
					/*
					 * Inserimos a linha no dtm
					 */
					dtm.addRow(linha);
				}

				/*ERRADO! ISSO FAZ COM QUE SE CRIA UMA NOVA TABELA A CADA CLIQUE
				 Cria a tabela.
				io_tb_tabela = new JTable(dados, colunas);
				io_sp_tabela = new JScrollPane(io_tb_tabela);
				io_sp_tabela.setBounds(5, 100, 415, 200);
				io_ct.add(io_sp_tabela);
				*/
				/*
				 * Agora, vamos associar a nossa JTable com o nosso novo
				 * TableModel. Issa fára com que sejam atyualizados os dados
				 */
				io_tb_tabela.setModel(dtm);
				
				// Cria o botão fecha.
				io_bt_fechar = new JButton(io_ie_fechar);
				io_bt_fechar.setBounds(325, 310, 95, 25);
				io_bt_fechar.setText("Fechar");
				io_ct.add(io_bt_fechar);

				// Repinta o container.
				io_ct.repaint();
			} else {
				JOptionPane.showMessageDialog(
					null,
					"Valor não pode estar vazio");
			}
		}
	};

	/**
	 * @param args
	 *            the command line arguments
	 */
	public static void main(String args[]) {

		// Decora a janela.
		JDialog.setDefaultLookAndFeelDecorated(true);
		JFrame.setDefaultLookAndFeelDecorated(true);

		// Executa o programa.
		JFrame frame = new teste();
		frame.show();
	}
}
lina

Oi,
consegui… realmente o new atrapalhava…
porem ele sobreescreve o valor… a parte mais dificil já foi…
vou tentar aqui pular uma linha…

Beijos!

Omeganosferatu

Tenta debugar, as vezes ajuda muito.

fabim

lina…

conselho de alguem que ja apanhou muito do swing: o swing é bom, porém um pouco complicado de mexer, mas justamente pq ele é muito bem arquitetado… no padrão mvc…

procure estudar a fundo a interação entre os views e os models, pra poder manipular direito os objetos swing :wink:

Criado 26 de março de 2007
Ultima resposta 30 de mar. de 2007
Respostas 17
Participantes 9