Bom dia a todos.
Tenho a seguinte duvida:
Imaginem uma matriz 10 linhas e 3 colunas. A quantidade de linha foi obtida apartir de uma JTable com o metodo getRowCount() e a quantidade de colunas é fixa!
Ao criar essa matriz, fiz da seguinte forma: String[][] vazio = new String[minhaTabela.getRowCount()][3];
O problema é: essa matriz vai receber todos os itens da tabela “minhaTabela” que estão com suas posições vazias. Porem, como informei no inicio ela comecou com 10 linhas.
Supondo que dessas 10 linhas apenas 4 estão com seu conteudo vazio, minha matriz vazio tera 4 linhas preenchidas com os indices das celulas vazias e tera mais 6 posições com o conteudo null por nao serem preenchidos.
Como posso fazer pra criar uma matriz sem um dimencionamento fixo? Como um ArrayList por exemplo? Onde consigo adicionar os itens utilizando meuArray.add()?
Desde já agradeço a todos.
Por que ao invés de usar uma matriz você não usa uma lista de objetos ? Além de você poder trabalhar as linhas da sua tabela com uma estrutura dinâmica (um ArrayList por exemplo) você melhora a semântica do seu modelo. Por exemplo, ao invés de:
String [][] cidades = {{"1", "São Paulo", "SP"},{"2", "Rio de Janeiro", "RJ"},{"3", "Salvador", "BA"}};
você faz:
class Cidade{
String codigo, nome, uf;
Cidade(String codigo, String cidade, String uf){
this.codigo = codigo;
this.cidade = cidade;
this.uf = uf;
}
}
List<Cidade> cidades = new ArrayList<>();
cidades.add(new Cidade("1", "São Paulo", "SP"));
cidades.add(new Cidade("2", "Rio de Janeiro", "RJ"));
cidades.add(new Cidade("3", "Salvador", "BA"));
no fim, a inicialização fica mais verbosa, mas a manipulação da lista e dos objetos fica mais fácil.
O conceito que voce usou é tipo um encapsulamento né?
Porem eu não utilizo os get e set para alimentar as posições da minha classe!
Dessa forma eu criarria um Array da classe Cidade que ira conter as tres posições (Codigo, Cidade, UF) correto?
Sim. Na verdade, eu só omiti os get/set para diminuir o código, mas é interessante você usá-los sim. Mas percebe que apesar de dar um pouco mais de trabalho, a sua estrutura fica mais clara ? Ou seja, cada coluna da tabela é uma propriedade da sua classe, enquanto que uma linha é um objeto dentro da lista.
Além disso, se você aprender a criar seu próprio TableModel, nem sequer precisará copiar dados da tabela para uma lista, e vice-versa.
Mano eu to recebendo um NullPointerException:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at pkg.forms.JFPrincipal.teste(JFPrincipal.java:621)
at pkg.forms.JFPrincipal.jBAtualizarCustoActionPerformed(JFPrincipal.java:359)
at pkg.forms.JFPrincipal.access$300(JFPrincipal.java:22)
at pkg.forms.JFPrincipal$5.actionPerformed(JFPrincipal.java:235)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:676)
at java.awt.EventQueue$4.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Segue meu código onde eu vasculho minha tabela:
private void teste() {
ArrayList<Objeto> vazio = new ArrayList<>();
int v = 0;
for (int i = 0; i < jTListaProdutos.getRowCount(); i++) {
if (jTListaProdutos.getValueAt(i, 4).toString().trim().equals("")) {
vazio.add(v, new Objeto(jTListaProdutos.getValueAt(i, 0).toString().trim(), jTListaProdutos.getValueAt(i, 1).toString().trim()));
v++;
}
}
for (int i = 0; i < vazio.size(); i++) {
System.out.println(vazio.get(i).toString());
}
}
ele ta dando erro no if que eu faço dentro do for!
Cara ignora o que mandei! Já resolvi… é que uma coluna da minha tabela é float e eu estava setando uma String.
Agora a minha duvida é:
Essa classe Objeto que criei… quando eu printo o conteudo dela (System.out.println(vazio.get(i)) ela me traz um monte de conteudo estranho.
Já sei que isso é a forma como o JAVA armazena dentro dos objetos.
Eu sobreescrevi o metodo toString() para retornar os dois campos.
Mais supondo que eu queira retornar apenas um campo, como faço pra que esse toStringo funcione com um campo apenas?
Dentro da classe se eu informar que o toString() só vai retornar o campo codigo, e eu quiser ver o conteudo do campo descrição eu nao consigo pois ele nao esta sendo retornado o toString().
Sera que fui claro? rsrsrsrs
Desde já agradeço.