Utilizando Scroll em AWT

Pessoal,

Eu preciso fazer uma coisa que procurando acho que já não é possivel, vou explicar:

Eu tenho um Frame AWT que possui um Panel e alguns List também do AWT

Eu preciso produzir um efeito de Scroll nessa tela, a qual vai preenchendo os List com valores vindos de outro lugar do meu Software

Ou seja, quando eu rodar a interface AWT ele vai preenchendo um List e o ScroolBar vai descendo passando para o usuário o efeito de Scroll

Acontece que eu tenho que fazer isso usando apenas AWT 1.3

Parece que é super facil fazer isso usando Swing e o tal do invokeLater

Achei um snippet de código que faz mais ou menos o que eu preciso (abaixo)

Minha pergunta é:

  • vale a pena continuar fuçando pra ver se é possível fazer usando AWT 1.3
  • digo para o meu chefe que não é possível (existe uma possibilidade de que o dispositivo onde vai rodar a aplicação tenha um java um pouquinho mais novo… )

Qualquer ajuda é bem vinda

Obrigado, André

[code]import java.awt.Color;
import java.awt.Frame;
import java.awt.GridBagLayout;
import java.awt.List;

public class Snippet3 extends Frame {

private static final long serialVersionUID = 1L;

private static boolean closeApplication;	

public static void main (String args[]) {
	long tempoAnterior = System.currentTimeMillis();		
	
	GridBagLayout layout = new GridBagLayout();		
			
	final Snippet3 snippet = new Snippet3();
	snippet.setTitle("Lazy Table");
	snippet.setSize (200, 200);
	snippet.setBackground(new Color(255,255,255));
	snippet.setLayout(layout);
	
	final List list = new List(8,false);
	
	final Thread thread = new Thread() {
		public void run() {
			int i;				
			for (i=0; i&lt1000; i++) {
				final int [] index = new int [] {i};
				Thread thread2 = new Thread() {						
					public void run() {
						list.add("Table Item "+index[0]);
					}
				};
				thread2.start();					
			}
			snippet.add(list);
			snippet.setVisible(true);
			
			if (i==1000){
				closeApplication=true;
			}	
			
		}
	};
	
	thread.start();
	try {
		thread.join();
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	
	if (closeApplication) {
		snippet.dispose();
	}
	
	long tempoPosterior = System.currentTimeMillis();
	
	System.out.println("tempo decorrido: "+(tempoPosterior - tempoAnterior));		
}[/code]

Um ScrollPane não resolve o problema???

T+

Olá,

Na verdade o ScroolPane e o List tem que ficar sendo preenchidos tipo em background, e eu não tava conseguindo simular isso usando Threads, achei que no awt vc pode fazer também java.awt.EventQueue.invokeLater(Runnable)

Vou fazer uns testes aqui…

Olá, estou quase lá,

Só precisaria agora que o foco fosse caminhando de acordo com a lista sendo preenchida, ou seja, ele vai adicionando itens ao List e o scroll vai descendo, de tal forma que ele sempre mostre os itens "centrais" na tela…

Por exemplo, suponha que o Frame exibe 8 itens, e meu list tem 8 itens, ele vai exibir os 8 itens, se eu tiver 14 itens ele vai exibir apenas os ultimos 8 itens, ou seja, 7,8,9,10,11,12,13,14

Obrigado, André :slight_smile:

import java.awt.Color;
import java.awt.Frame;
import java.awt.GridBagLayout;
import java.awt.List;
import java.awt.ScrollPane;

/**
 * @author andre.fonseca
 *
 */
public class Snippet5 extends Frame {

	public static void main(String[] args) {
		long tempoAnterior = System.currentTimeMillis();
	
		final Snippet5 snippet = new Snippet5();
		snippet.setTitle("Lazy Table");
		snippet.setSize(200,200);
		snippet.setBackground(new Color(255,255,255));
		snippet.setLayout(new GridBagLayout());
		
		final List list = new List(10,false);
		
		final ScrollPane scrollpane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
			
		final Thread thread = new Thread() {
			public void run() {
				int i;				
				for (i=0; i&lt100; i++) {
					final int [] index = new int [] {i};
					Thread thread2 = new Thread() {						
						public void run() {
							list.add("Table Item "+index[0]);
						}
					};
					thread2.start();										
				}
				scrollpane.add(list);
				snippet.add(scrollpane);
				snippet.setVisible(true);		 	
			}
		};
		
		thread.start();
		java.awt.EventQueue.invokeLater(thread);
		
		long tempoPosterior = System.currentTimeMillis();
		
		System.out.println("tempo decorrido: "+(tempoPosterior - tempoAnterior));
	}
}