Gravar List<object> Java em ficheiros

No construtor GestãoClientes, o que é o act_listaClientes? Se não for uma instância da classe então é óbvio que está errado, porque o teu método actualiza_lista é um método de instância e não de classe. Acho que devias estudar um pouco melhor programação orientada a objectos bem como as convenções de escrita de código em Java, vejo aí muita confusão e programação à pedreiro (ir experimentando até dar).
 
No construtor GestãoClientes, o que é o act_listaClientes? Se não for uma instância da classe então é óbvio que está errado, porque o teu método actualiza_lista é um método de instância e não de classe. Acho que devias estudar um pouco melhor programação orientada a objectos bem como as convenções de escrita de código em Java, vejo aí muita confusão e programação à pedreiro (ir experimentando até dar).

O act_listaClientes é apenas uma função. Isto é a ideia basica de função em C por exemplo, em que se passa parametros e a função retorna algo.

Como em java as funções estão dentro de classes, é assim que as chamo. Provavelmente está mal...
 
Até tenho medo de perguntar isto mas, metodo e função não é a mesma coisa?

"public String[] actualiza_lista(int num_funcionario)"

O parametro é o nº do funcionario que faz login no sistema. A função processa e depois retorna o vector de Strings.
 
"Função" é utilizado em C (por exemplo). Em POO chama-se "método". Questões de nomenclatura.
Eu sei que actualiza_lista é um método, isso está certo. Mas a questão é que ao fazeres act_listaClientes.actualiza_lista(...), o que estás a dizer é que estás a invocar o método de classe actualiza_lista da classe act_listaClientes. Ora, actualiza_lista não é um método de classe, mas sim de instância.
 
Não li com atenção, mas isso não dá para fazer só com as classes ObjectInputStream e ObjectOutputStream? São meia dúzia de linhas de código.
 
Ora, actualiza_lista não é um método de classe, mas sim de instância.

Qual é a diferença?

Será um método de classe poder ser acedido livremente pelo exterior, enquanto que um método de instância nos obriga a criar uma variável do tipo da classe para poder executar o metodo (aka instância da classe)?
 
Qual é a diferença?

Será um método de classe poder ser acedido livremente pelo exterior, enquanto que um método de instância nos obriga a criar uma variável do tipo da classe para poder executar o metodo (aka instância da classe)?
Deixo aqui referências por onde poderás aprender:

http://java.sun.com/docs/books/tutorial/java/javaOO/usingobject.html
http://java.sun.com/docs/books/tutorial/java/javaOO/classvars.html
http://java.sun.com/docs/books/tutorial/java/javaOO/summaryclasses.html
 
Já estou a entender + ou - como isto funciona. Ando há 5 anos a programar em C, algum assembly no ano passado.

Passar para este nivel de programação é bem diferente. A programação é mais protegida, por exemplo as variáveis das classes.

Em C até se utiliza apontadores, para andar a passear pela memoria. :P

Outra coisa, vamos imaginar que o utilizador abre o programa, e depois carrega num botão que abre uma janela "x". Como é que eu faço para não deixar o utilizador aceder à janela principal antes de concluir a tarefa na janela "x" que foi aberta?
 
Penso que tens de usar uma JDialog: http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html

There are two basic types of dialogs. Modal and modeless. Modal dialogs block input to other top level windows. Modeless dialogs allow input to other windows. What type of dialog to use, depends on the circumstances. An open file dialog is a good example of a modal dialog. While choosing a file to open, no other operation should be permitted. A typical modeless dialog is a find text dialog. (Like in Eclipse IDE.) It is handy to have the ability to move the cursor in the text control and define, where to start the finding of the particular text.
 
Queria fazer uma coisa semelhante a uma tabela de uma factura.
Para isso estava a pensar fazer o seguinte.

Criar a Classe "Produto", e a partir daí criar uma List<Produto> que é os produtos que a loja tem. Só que no meu caso os produtos nunca vão mudar. Vão existir sempre, apenas muda o seu valor.
PHP:
public class Produto implements Serializable {

    private int codigoProduto;
    private String descricao;
    private double preco;

//Construtores e funções...

}

Mas agora precisava de escolher o produto que quero (Através de uma ComboBox) e indicar a quantidade. O Subtotal seria calculado no momento (preço * quantidade)
Para isso criava esta Classe:

PHP:
public class LinhaFactura implements Serializable {

    private int codigoProduto;
    int quantidade;

//Construtores e funções...

}

A partir daqui criava uma List<LinhaFactura> e tinha assim a minha tabela criada. O "codigoProduto" da "LinhaFactura" seria o código do produto que o cliente comprasse
No entanto, não sei se esta é a melhor abordagem.

Será correcto?
 
Última edição:
Podes fazer assim ou então usas um Map<Integer,Integer> que vai estabelecer a relação <codigoProduto,quantidade>, indicando para cada produto qual a quantidade comprada. Mas da forma que estás a fazer até é capaz de ser a melhor, porque é mais modular ao contemplares uma classe LinhaFactura.
 
Estou com um problema

Tenho aqui uma janela, que ao carregar num botão, preenche um vector e depois faz o seguinte:
PHP:
for (int i = 0; i < vector.size(); i++) {
            taskOutput.append("\nDownloading: " + vector.get(i));
            Servidor_LN.Download saca = new Servidor_LN.Download(vector.get(i));
            saca.run();
            taskOutput.append("\nDownload " + vector.get(i) + " terminado");
    }
taskOutput - é uma textArea para mostrar o progresso.
Servidor_LN.Download - é a minha classe que tem "extends Thread".

O problema é que o GUI fica bloqueado enquanto faz o ciclo, e so mostra os "append" no final. Como o vector pode ter ate 18 elementos, a tarefa pode por si demorar ate 2 min a fazer, portanto dava jeito o utilizador receber um feedback do programa em como está a trabalhar.

Já tentei "saca.start()", mas neste caso a textArea é preenchida toda de uma vez, e as threads ficam a trabalhar em background. Não é feito um retorno gradual do trabalho efectivamente executado.

Como me posso desembrulhar disto? :confused:
 
Estou com um problema

Tenho aqui uma janela, que ao carregar num botão, preenche um vector e depois faz o seguinte:
PHP:
for (int i = 0; i < vector.size(); i++) {
            taskOutput.append("\nDownloading: " + vector.get(i));
            Servidor_LN.Download saca = new Servidor_LN.Download(vector.get(i));
            saca.run();
            taskOutput.append("\nDownload " + vector.get(i) + " terminado");
    }
taskOutput - é uma textArea para mostrar o progresso.
Servidor_LN.Download - é a minha classe que tem "extends Thread".

O problema é que o GUI fica bloqueado enquanto faz o ciclo, e so mostra os "append" no final. Como o vector pode ter ate 18 elementos, a tarefa pode por si demorar ate 2 min a fazer, portanto dava jeito o utilizador receber um feedback do programa em como está a trabalhar.

Já tentei "saca.start()", mas neste caso a textArea é preenchida toda de uma vez, e as threads ficam a trabalhar em background. Não é feito um retorno gradual do trabalho efectivamente executado.

Como me posso desembrulhar disto? :confused:

Acho que a resposta para o teu problema é: SwingWorker

EDIT - o Baderous antecipou-se
 
Muito obrigado, consegui implementar isso. Agora até podia por isto tudo pipi, e meter uma barra de loading. Mas acho que vou deixar isso para depois....:P

O trabalho está praticamente finalizado, agora é mais um processo de optimizar o visual, limpar os "System.out" de testes e tratar excepções. :P

Queria só colocar uma duvida.
Temos, por exemplo, uma janela com uma lista de clientes e ao lado um botão. Carregando nesse botão abre outra jframe com um formulário. Depois de preenchido, e carregando no botão Adicionar, esse cliente é adicionado, e a janela do formulário fecha.
Mas eu agora queria actualizar a lista da jframe principal. Como é que se faz isto BEM?
Eu consegui fazer pondo um método "actualizaLista" como Static na janela principal, que depois é chamado na jframe do formulário depois de carregar no botão adicionar.

Pelo que já li deve-se evitar utilizar Static, porque quebra a ideia de uma linguagem OO. E realmente as vezes torna-se difícil implementar a função Static, devido às variáveis utilizadas, que também têm de ser static....
 
Os metodos "static" têm a sua utilidade, quanto mais não seja para alguns padrões de software tipo Singleton.
Se a ideia é ter um determinado serviço, sempre com o mesmo comportamento, independemente da instância, então o static faz sentido.
O truque está em saber usá-lo.

@Spiderman, tanto quanto sei, se tiveres um metodo static, e quiseres usar variaveis não static lá dentro, tens de criar uma instancia da classe em que estás a trabalhar. Mas é melhor alguém confirmar, assim de repente só me lembro quando se criam alguns metodos dentro de uma classe que contém o "static main".
 
Back
Topo