JAVA APLICAÇÕES GRÁFICAS Propriedades Utilizadas: Is Event Dispatcher Threade (Animation) FACULDADE DE TECNOLOGIA SENAC PELOTAS Nome do aluno: João Vitor Ávila dos Santos Identificação da Turma: 3º Semestre/ Noite Data: 16/05/2010.
1 Nome da Propriedade 1 Is Event Dispatcher Threade (Animation); 1.1 Introdução e Funcioamento A propriedade Is Event Dispatcher Threade quando compilada, abre uma janela com 9 (nove) retângulos (3 x 3) que podem ser preenchidos pelas cores: vermelha, verde ou azul através de um comando do usuário, que pode também optar em preencher os retângulos com cores aleatórias através de cliques em um botão, onde cada clique é uma cor diferente ou igual às três cores citadas acima. 1.2 Código da aplicação /* * To change this template, choose Tools Templates * and open the template in the editor. */ package trabalho; /** * * @author João Vitor */ import java.awt.color; import java.awt.component; import java.awt.dimension; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.util.random; import javax.swing.abstractaction; import javax.swing.buttongroup; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jradiobutton; import javax.swing.jtable; import javax.swing.swingutilities; import javax.swing.table.abstracttablemodel; import javax.swing.table.tablecellrenderer; public class IsEDTExample extends JPanel { private boolean keeprunning; private static int RED = 0; private static int BLUE = 1; private static int GREEN = 2; Faculdade Senac Pelotas Página 2
private static int VARIABLE = 3; private static int SIZE = 3; private int threadshade; private ColorTableModel tablemodel= new ColorTableModel(); private Thread colorshadethread; public IsEDTExample() { JTable table = new JTable(tableModel); table.setrowheight(100); table.setdefaultrenderer(object.class, new ColorRenderer()); add(table); add(new JLabel("Selecione a cor para um teste : ")); ButtonGroup group = new ButtonGroup(); JRadioButton redoption = new JRadioButton("Vermelho"); group.add(redoption); redoption.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { threadshade = RED; ); JRadioButton blueoption = new JRadioButton("Azul"); group.add(blueoption); blueoption.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { threadshade = BLUE; ); JRadioButton greenoption = new JRadioButton("Verde"); group.add(greenoption); greenoption.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { threadshade = GREEN; ); redoption.setselected(true); this.threadshade = RED; add(redoption); add(greenoption); add(blueoption); add(new JButton(new RandomColorAction())); this.keeprunning = true; this.colorshadethread = new Thread(new RandomColorShadeRunnable()); this.colorshadethread.start(); Faculdade Senac Pelotas Página 3
private class RandomColorAction extends AbstractAction { public RandomColorAction() { super("criar cor aleatória"); public void actionperformed(actionevent e) { IsEDTExample.this.tableModel.generateRandomColor(VARIABLE); private class ColorTableModel extends AbstractTableModel { private Color[][] colors = new Color[3][3]; public ColorTableModel() { for (int i = 0; i < SIZE; i++) { for (int x = 0; x < SIZE; x++) { colors[i][x] = Color.white; public int getrowcount() { return SIZE; public int getcolumncount() { return SIZE; public Object getvalueat(int rowindex, int columnindex) { return colors[rowindex][columnindex]; public void generaterandomcolor(int type) { Random random = new Random(System.currentTimeMillis()); final int row = random.nextint(size); final int column = random.nextint(size); final Color color; if (type == RED) { color = new Color(random.nextInt(256), 0, 0); else if (type == BLUE) { color = new Color(0, 0, random.nextint(256)); else if (type == GREEN) { color = new Color(0, random.nextint(256), 0); else { color = new Color(random.nextInt(256), random.nextint(256), random.nextint(256)); if (SwingUtilities.isEventDispatchThread()) { colors[row][column] = color; firetablecellupdated(row, column); else { SwingUtilities.invokeLater(new Runnable() { public void run() { colors[row][column] = color; Faculdade Senac Pelotas Página 4
firetablecellupdated(row, column); ); private class ColorRenderer implements TableCellRenderer { private JLabel label; public ColorRenderer() { label = new JLabel(); label.setopaque(true); label.setpreferredsize(new Dimension(100, 100)); public Component gettablecellrenderercomponent(jtable table, Object value, boolean isselected, boolean hasfocus, int row, int column) { label.setbackground((color) value); return label; private class RandomColorShadeRunnable implements Runnable { public void run() { while (keeprunning) { tablemodel.generaterandomcolor(threadshade); try { Thread.sleep(500); catch (InterruptedException e) { public static void main(string[] a) { JFrame f = new JFrame("Is Event Dispatch Thread Example"); f.setdefaultcloseoperation(jframe.exit_on_close); f.add(new IsEDTExample()); f.pack(); f.setvisible(true); Faculdade Senac Pelotas Página 5
1.3 Propriedades utilizadas Classes: IsEDTExample : são criadas variáveis privates com os nomes das cores possíveis para a troca, uma variável para determinar a quantidade de retângulos, uma variável tablemodel do tipo ColorTableModel (criação de um novo objeto) que utiliza o método setrowheight para dar um tamanho a janela; VARIABLE : variação de cores(no caso pode variar entre 3 cores); threadshade variável para buscar as cores; colorshadethread usada para as cores aleatórias; kepprunnig : para a inicialização do ciclo(se receber true). Seu construtor cria um novo objeto table do tipo JTable que recebe como parâmetro a variável tablemodel (criação da janela). Usa a classe JRadioButton para criar um objeto para os botões (rádio) onde o usuário seleciona a cor desejada (o nome da variável de referência será o nome da cor escolhida); Quando selecionado um botão a cor do mesmo é passada como parâmetro para uma variável group que faz referência ao método add da classe ButtonGroup. Após, a variável (nome da cor) é usada para instanciar o método addactionlistener (da classe ActionListener) que faz as variações na tonalidade da cor. Esse processo é feito com as três cores possíveis ao usuário. Após, o construtor seleciona uma cor (variável) para começar o processo através do comando: blueoption.setselected(true); this.threadshade = BLUE; Por último é criado o botão para selecionar cor aleatória, e é iniciado o processo através do comando: this.colorshadethread.start(); RandomColorAction : extende a classe AbstractAction e cria um construtor jogando uma frase no botão de criação de cor aleatória, tem o método actionperformed abstrato de AbstractAction, ColorTableModel : tem um variável private que é uma matriz para armazenar a cores dos retângulos o seu construtor percorre o tamanho do retângulo e implementa a cor branca(inicial); Os métodos getrowcount e getcolumncount retornam os tamanhos de linha e coluna, o método getvalueat : retorna uma matriz com as cores de linha e coluna; o método generaterandomcolor : método não compreendido completamente, Faculdade Senac Pelotas Página 6
ColorRenderer (não compreendida):tem um construtor que declara uma variável label do tipo JLabel e nele instancia 2 (dois) métodos : label.setopaque(true); label.setpreferredsize(new Dimension(100, 100)); O método gettablecellrenderercomponent apesar de ser GET recebe 6(seis) variáveis como parâmetro e retorna a variável de referência label.(nas aulas vimos métodos GET s sem parâmetros e declarando o tipo de elemento que irá retornar, diferente visto neste método); RandomColorShadeRunnable : em seu método vazio run() é declarado um procedimento de tentativa e erro( try/cacth ) dentro de uma repetição while, que manda executar a rotina de troca das cores e caso haja algum erro é interrompido o processo enquento a variável (keepruunning)que da início ao procedimento for verdadeira(true). Main : Cria um novo objeto instanciando a classe JFrame, como argumento o título da janela Frame, indica como a janela será fechada através do método setdefaultcloseoperation(), e instancia a classe principal. 1.4 Visualização da Ferramenta em Funcionamento Figura 1. Aqui está sendo selecionada a cor vermelha. Faculdade Senac Pelotas Página 7
Figura 2.. Aqui está sendo selecionada a cor verde. 1.5 Conclusão O que foi aprendido... A reutilização de códigos é um dos benefícios da programação orientada a objetos, podem-se usar muitas classes prontas já exitem no Java. Para programar em O.O é necessário um projeto. Se quisermos aprender a programar é necessário muito estudo além do que é ensinado na faculdade. Dificuldades... A finalidade de algumas classes importadas. Métodos recebendo objetos como parâmetros. Métodos GET s recebendo parâmetos. Lógica. Conhecimentos... Considero que tudo o que foi dito na conclusão são conhecimentos. Aplicação escolhida ( funcionamento)... Uma aplicação dinâmica, onde o usuário interage com o programa podendo escolher uma variação de cores que, após serem aplicadas têm uma rotina individual definida no construtor da classe pricipal. Faculdade Senac Pelotas Página 8