Mudando de referência JTable em tempo de execução - não aparecendo em GUI

votos
0

Eu estou tentando se familiarizar com o desenvolvimento Java ME para o Pocket PC. Estou executando o emulador NSIcom CRE-ME e construir minha aplicação com o NetBeans 6.5.

O pedido baseia-se em torno de três painéis de guia, cada um dos quais têm componentes Swing. O conteúdo componentes Swing são atualizados em vários pontos da aplicação. Estes componentes incluem um JTextArea, JTextFields, e mais significativamente, uma JTable dentro de um JScrollPane.

O JTable está causando problemas. Se eu inicializar-lo através de Matisse com alguns dados de exemplo, parece. Mas se eu tentar definir a referência da JTable em tempo de execução no método populateFields () abaixo, não aparece nada. Note que este é simplesmente com os dados da tabela de amostra do tutorial Sun, nem mesmo a minha TableModel personalizado.

O que estou fazendo de errado? Existe algum método de atualização óbvio que eu preciso chamar, ou algum outro gritante erro / conecpt eu perdi? Eu tentei praticamente todos os métodos possíveis eu me deparei com que eu pensei que poderia ter algo a ver com isso.

O método populateFields () é chamado em vários momentos durante o programa.

    public void populateFields()
    {

        String[] columnNames = {First Name, Last Name,Sport, # of Years, Vegetarian};
        Object[][] data = { {Mary, Campione, Snowboarding, new Integer(5), new Boolean(false)},
            {Alison, Huml, Rowing, new Integer(3), new Boolean(true)},
            {Kathy, Walrath, Knitting, new Integer(2), new Boolean(false)},
            {Sharon, Zakhour, Speed reading, new Integer(20), new Boolean(true)},
            {Philip, Milne, Pool, new Integer(10), new Boolean(false)} };


        this.tableSurvey = new JTable(new DefaultTableModel(data, columnNames));
        this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);
        DefaultTableModel dtm = (DefaultTableModel) this.tableSurvey.getModel();
        dtm.fireTableStructureChanged();
        dtm.fireTableDataChanged();
        this.scrollPaneSurvey.invalidate();
        this.scrollPaneSurvey.validate();
        this.panelSurvey.validate();
        this.panelSurvey.repaint();
    }
Publicado 30/12/2008 em 14:19
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

OK, eu finalmente descobri que, aparentemente, isso é tudo que eu preciso:

this.tableSurvey = new JTable(new DefaultTableModel(data, columnNames));       
this.scrollPaneSurvey.setViewportView(this.tableSurvey);
this.scrollPaneSurvey.validate();

Alguém pode explicar por que usar o código abaixo em vez do método setViewportView () não funcionou?

this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);

Obrigado!

Respondeu 30/12/2008 em 17:16
fonte usuário

votos
0

Eu acho que, com base em seus trechos de código, que você está fazendo o

this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);

Mas o problema é que o gerente de layout do painel mãe tem a sua própria referência para o antigo scrollPaneSurvey. Então, quando você recriá-lo, você nunca substituir o componente existente, e este novo componente nunca é adicionado ao gasoduto render. Sua classe sabe sobre ele, mas o pai não vê a notificação de que algo mudou.

Isso faz sentido?

Onde como na segunda parte que você postar, você está dizendo a scrollPaneSurvey o que deveria estar exibindo, que gera as notificações para repintar automaticamente.

Respondeu 31/12/2008 em 02:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more