Mostrando postagens com marcador SWT. Mostrar todas as postagens
Mostrando postagens com marcador SWT. Mostrar todas as postagens

terça-feira, 27 de novembro de 2007

O grande livrão verde do SWT

Eu tava procurando coisas sobre SWT na internet.. Tem muita coisa legal, e muita coisa espalhada, além do grande guia do site do eclipse.
Daí eu tava pensando, vou criar um grande livrão verde, ensinando aos usuários de Swing como portar as aplicações pra SWT sem maiores dificuldades, relacionando cada item do Swing ao seu correspondente em SWT.

Deve ficar pronto até o dia 15.

Té mais o/

segunda-feira, 19 de novembro de 2007

Exibindo (e dimensionando) uma imagem no SWT

Existe um monte de jeito de fazer isso, esse aqui é o mais fofinho... Ele exibe a imagem dentro de um Canvas, e toda vez que ele precisa repintar a imagem, ele dimensiona de acordo com o tamanho do "container" (composite) pai.

Eis o código:


final Composite composite = new Composite(shell, SWT.NONE);
final Image image = SWTResourceManager.getImage(PrincipalSWT.class, "/com/trabalho/imgs/imagem.jpg");
final int width = image.getBounds().width;
final int height = image.getBounds().height;

Canvas canvas = new Canvas(composite, SWT.NONE);
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawImage( image, 0, 0, width, height, 0, 0,
(int) composite.getSize().x, (int)composite.getSize().y );
}
});

Peguei o código e adaptei daqui

Por hoje, é isso...
Té mais o/

terça-feira, 13 de novembro de 2007

Retirando a seleção em uma tabela no SWT

Hoje, quando eu tava mexendo com uma Table no SWT, percebi que quando a pessoa clica em um item, esse item fica selecionado até que o usuário clique em outro item. Isso pode ser útil pra alguém, mas acho mais legal que o item continue selecionado até que o usuário clique em outro componente, ou quando o usuário clicar em uma linha vazia da tabela.

Pra resolver isso, tem essa gambiarrinha aqui ó:


Table table = new Table(shell, SWT.FULL_SELECTION
| SWT.BORDER);

table.addMouseListener(new MouseAdapter() {
public void mouseDown(final MouseEvent arg0) {
if (table.getItem(new Point(arg0.x, arg0.y)) == null) {
//Se o usuário clica em uma linha vazia
table.deselectAll();
}
}
});
table.addFocusListener(new FocusAdapter() {
public void focusLost(final FocusEvent arg0) {
//Se o usuário clica em outro componente
table.deselectAll();
}
});


Era isso, Té mais o/

segunda-feira, 12 de novembro de 2007

Multithreading com SWT

Antes de mais nada, um pequeno comentário de um usuário de Swing, em relação ao SWT:

Ô coisa complicada do demo!


Tá. Desespero de lado, vamos ao que interessa: Acessando elementos gráficos do SWT através de uma outra thread.

Vamos dizer que eu tenho um programa, que tem que monitorar o banco de dados, de 5 em 5 segundos, e colocar o valor de um campo em um Text (o equivalente SWT ao JTextField).
Primeiro, criamos o Text:


Text campoText = new Text(composite, SWT.BORDER);


Beleza. Agora, se a gente tenta acessar ele através de uma outra Thread, o maldito "Invalid Thread access" aparece, indicando que a gente tem que mudar de estratégia.

O que deve ser feito? Criar uma Thread mais ou menos assim:


final Thread t = new Thread(){
public void run(){
while(true){
Display display = shell.getDisplay();
if(display == null || display.isDisposed()) return;
display.asyncExec(new Runnable() { //Início do Runnable
public void run() {
String str = pegaCampoDaTabelaTal();
campoText.setText(str);
}
}); //Fim do Runnable
try { // Tenta dormir (FORA do Runnable)
sleep(5000); // 5 segundos
} catch (InterruptedException e) {}
} // Fim do while
} //Fim do método run
}; // Fim da Thread
t.start(); // Inicia a Thread \o/


Com o trecho de código acima, é possível acessar campoText através da Thread t, sem dor, só alegria!

Um pequeno parênteses: Existe uma diferença bem grande entre os métodos asyncExec() e syncExec().
O primeiro é executado pela segunda Thread sem que a primeira Thread (a principal) seja notificada. Já o segundo vai suspender a thread principal até que o segundo Runnable (linha 6) seja finalizada. Como no nosso caso, é mais interessante que o programa continue lépido e fagueiro.

Té mais o/

segunda-feira, 22 de outubro de 2007

Verificar atributos únicos no Text do SWT

Eu fiz um meigo código pra verificação de atributos únicos no SWT. Funciona mais ou menos assim: O usuário digita o texto, e ele verifica se o texto coincide com o texto do mesmo campo de uma lista de objetos do mesmo tipo (vinda do banco de dados, no caso).

Vamos supor que o campo seja Placa de automóvel.


placaText = new Text(composite, SWT.CENTER | SWT.BORDER);
placaText.addVerifyListener(new VerifyListener() {
public void verifyText(final VerifyEvent e) {
e.text = e.text.toUpperCase();
if (e.keyCode == 127) e.doit = false; // Não permite a tecla Delete
else {
StringBuffer buffer = new StringBuffer(placaText.getText());
buffer.insert(e.start, (e.keyCode != 8) ? e.character : '$');
boolean existe = false;
// Só testa quando o tamanho estiver correto,
// evitar loops desnecessários
if (buffer.toString().length() == 8) {
for (Automovel a : listaautomoveis) {
if (buffer.toString().equalsIgnoreCase(a.getPlaca())) {
existe = true;
break;
}
}
}
// isso é um label. Pode ser colocado embaixo do campo "placa" ;)
erroPlacaL.setText(existe ? "Placa já cadastrada" : "");
}
}
});
placaText.setTextLimit(8);


E eu continuo minha busca incessante por um primo do JFormattedTextField pra SWT :(

Té mais o/

sexta-feira, 19 de outubro de 2007

JOptionPane no SWT

Recentemente, decidi dar uma chance pro SWT, pra ver qual é que era.
Descobri que o SWT é bom \o/

Agora vamos a alguns componentes legais do SWT, e seus correlatos em Swing.

O primeiro da série é o MessageBox, equivalente direto do JOptionPane.
O código pra inserir uma MessageBox na sua aplicação é:


MessageBox messagebox = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
messagebox.setText("Título da Janela");
messagebox.setMessage("Mensagem");
messagebox.open();


Considerações:

shell: Nome do componente que chama a aplicação.
SWT.OK | SWT.ICON_ERROR: Style bit que indica à aplicação quais elementos devem aparecer na janela. Pra uma MessageBox, os style bits mais usados são:

Botões:

  • SWT.ABORT: Botão "Abortar" (Falhar)
  • SWT.RETRY: Botão "Repetir"
  • SWT.IGNORE: Botão "Ignorar"
  • SWT.OK: Botão "OK"
  • SWT.CANCEL: Botão "Cancelar"
  • SWT.YES: Botão "Sim"
  • SWT.NO: Botão "Não"


Ícones:

  • SWT.ICON_ERROR: Erro
  • SWT.ICON_INFORMATION: Informação
  • SWT.ICON_WARNING: Aviso
  • SWT.ICON_QUESTION: Pergunta
  • SWT.ICON_WORKING: Trabalho (geralmente, igual ao de informação)


Agora é só usar a massa cinzenta pra fazer isso ser útil.

Té o/