Pergunta

Eu usei uma classe interna anon para obter um botão OBJ:

Button modButton = new Button("Modify");
modButton.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        //TODO: link to a pop-up, and do a refresh on exit
    }
});

Quero usar isso em um GWT Flextable de tamanho arbitrariamente (que é basicamente uma tabela de re-dimensionamento automática).

Se eu fizer algo assim:

currentTable.setText(3, 0, "elec3");
currentTable.setWidget(3, 2, modButton);

currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, modButton);

O botão aparece apenas para o último (já que existe apenas uma instância). Como a tabela acima será preenchida programaticamente, não é realmente prático definir um novo botão para cada instância possível.

Eu tentei o seguinte:

currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, new Button("Modify");
modButton.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        //TODO: link to a pop-up, and do a refresh on exit
    }
});
);

No entanto, isso não vai compilar (o primeiro; eu acho), estou um pouco perdido - como posso realizar esse efeito?

Obrigado

Foi útil?

Solução

Sua sintaxe está incorreta no terceiro exemplo, mas, em qualquer caso, usar uma classe anônima nesse caso é impossível. Você está tentando ligar para o AddClickHandler no objeto recém-instantado, que não é armazenado em nenhuma variável. Teoricamente, você pode colocar esse código em um construtor para sua classe anônima e chamar essa função em "This". O problema é que, devido às peculiaridades da sintaxe de classe anônima de Java (absolutamente atroz), é impossível definir um construtor (como seria chamado?).

Não tenho 100% de certeza de que entendi o que você está tentando realizar, mas você poderia definir uma função que acabou de devolver uma nova instância de botão, configurada corretamente cada vez que você chamou? Por exemplo,

private Button newModButton() {
    Button modButton = new Button("Modify");
    modButton.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            //TODO: link to a pop-up, and do a refresh on exit
        }
    });
    return modButton;
}

Então você ligaria

currentTable.setWidget(4, 2, newModButton());

Outras dicas

A maneira mais eficiente (tanto da visão do GWT quanto da quantidade de código) é para a sua classe implementar ClickHandler e então para cada linha criar um novo Button (vocês não pode Adicione o mesmo Widget duas vezes para o DOM):

class Foo extends Composite implements ClickHandler {

    public Foo() {
        FlexTable currentTable = new FlexTable();

        Button button = new Button("Button1");
        // Add this class as the ClickHandler
        button.addClickHandler(this);
        currentTable.setText(3, 0, "elec3");
        currentTable.setWidget(3, 2, button);

        button = new Button("Button2");
        // Add this class as the ClickHandler
        button.addClickHandler(this);
        currentTable.setText(4, 0, "elec4");
        currentTable.setWidget(4, 2, modButton);
    }


    public void onClick(ClickEvent event) {
        //TODO: link to a pop-up, and do a refresh on exit
    }

}

Observe o que estamos fazendo aqui - não há aulas anônimas, implementamos a interface ClickHandler uma vez. Isso é mais eficiente do que criar uma classe anônima para cada botão (quando você deseja que todos os botões se comportem da mesma maneira), porque, caso contrário, a GWT precisaria criar um código adicional para cada botão que você adicionar - em vez e referenciado por todos os botões.

PS: Talvez você deva considerar usar um IDE como o Eclipse (com o Google Plugin para Eclipse) - Isso torna o desenvolvimento da GWT uma brisa e capturaria erros de sintaxe como o do seu último snippet de código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top