You are on page 1of 46

JButton

Deriva de AbstractButton

Pode mostrar texto e imagem


A letra sublinhada indica a mnemnica (keyboard shotcut)
Pode ser definido um boto selecionado por defeito (setDefaultButton)
no contentor de alto nvel dos botes (p.ex. JFrame ou JDialog)
Os botes disabled tm aspeto diferente
Cdigo para o Middle Button do exemplo:
ImageIcon middleButtonIcon = createImageIcon("images/middle.gif");
b2 = new JButton("Middle button", middleButtonIcon);
b2.setVerticalTextPosition(AbstractButton.BOTTOM);
b2.setHorizontalTextPosition(AbstractButton.CENTER);
b2.setMnemonic(KeyEvent.VK_M);

Programao Avanada em Java

2012-2013

PAJ03.2

JCheckBox

Deriva de AbstractButton
Tem um atributo selected (boolean)
Pode fazer parte de menus
Ao ser atuado, gera um item event e um
action event
normalmente usa-se o item event
chinButton = new JCheckBox("Chin");
chinButton.setMnemonic(KeyEvent.VK_C);
chinButton.setSelected(true);
chinButton.addItemListener(this);

public void itemStateChanged(ItemEvent e) {


...
Object source = e.getItemSelectable();
if (source == chinButton) {
//...make a note of it...
} else {
...
}
if (e.getStateChange() == ItemEvent.DESELECTED)
//...make a note of it...
...
updatePicture();
}
Programao Avanada em Java

2012-2013

PAJ03.2

JRadioButton
Deriva de AbstractButton
Semelhante a JCheckBox, mas em cada
momento s um boto de cada grupo pode
estar selecionado
O grupo definido por um ButtonGroup
Ao ser atuado, gera um action event e dois
item events, um para cada opo mudada
normalmente usa-se o action event
JRadioButton birdButton = new JRadioButton(birdString);
birdButton.setMnemonic(KeyEvent.VK_B);
birdButton.setActionCommand(birdString); // birdString j definida
birdButton.setSelected(true);
birdButton.addActionListener(this);

//Group the radio buttons.


ButtonGroup group = new ButtonGroup();
group.add(birdButton);

public void actionPerformed(ActionEvent e) {


picture.setIcon(new ImageIcon("images/"
+ e.getActionCommand()
+ ".gif"));
}
Programao Avanada em Java

2012-2013

PAJ03.2

Botes (API)
Construtor de JButton
JButton(String, Icon), JButton(String), JButton(Icon), JButton()

Construtor de JCheckBox
JCheckBox(), JCheckBox(String), JCheckBox(Icon)
JCheckBox(Icon, boolean), JCheckBox(String, Icon)
JCheckBox(String, boolean), JCheckBox(String, Icon, boolean)

Construtor de JRadioButton
JRadioButton(), JRadioButton(String), JRadioButton(Icon),
JRadioButton(String, boolean), JRadioButton(Icon, boolean),
JRadioButton(String, Icon), JRadioButton(String, Icon, boolean)

ButtonGroup
ButtonGroup()
void add(AbstractButton), void remove(AbstractButton)
public ButtonGroup getGroup()
retorna o grupo que controla um boto
public ButtonGroup clearSelection()
limpa o estado selected dos botes do grupo

Programao Avanada em Java

2012-2013

PAJ03.2

Botes (API cont.)


Contedo do boto

void setAction(Action), Action getAction()


void setText(String), String getText()
void setIcon(Icon), Icon getIcon()
void setDisabledIcon(Icon), Icon getDisabledIcon(),

Aspeto
void setHorizontalAlignment(int), void setVerticalAlignment(int),
int getHorizontalAlignment(), int getVerticalAlignment()
void setHorizontalTextPosition(int), void setVerticalTextPosition(int),
int getHorizontalTextPosition(), int getVerticalTextPosition()
void setMargin(Insets), Insets getMargin()
void setIconTextGap(int), int getIconTextGap()

Funcionalidade
void setSelected(boolean), boolean isSelected()
void addActionListener(ActionListener),
ActionListener removeActionListener()
void addItemListener(ItemListener), ItemListener removeItemListener()
void setMnemonic(int), char getMnemonic(),
Programao Avanada em Java

2012-2013

PAJ03.2

JList
A JList apresenta um grupo de itens, em
uma ou mais colunas
A JList tem associado um ListModel, que
armazena os dados
ListModel: interface
AbstractListModel: o programador gere os
dados e invoca os mtodos fire. Tem
que estender a classe abstrata
AbstractListModel e implementar os
mtodos getSize e getElementAt
DefaultListModel: est tudo tratado; serve
para a maior parte das aplicaes
Se o construtor inicializar a JList com um
array ou um Vector, automaticamente
criado, e -lhe associado, um ListModel
imutvel.

Exemplo de uso de uma JList:


JList list = new JList(data); //data has type Object[]
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setVisibleRowCount(-1);
Programao Avanada em Java

2012-2013

PAJ03.2

JList seleo de elementos


Seleo de itens
setSelectionMode
SINGLE_SELECTION
SINGLE_INTERVAL_SELECTION
MULTIPLE_INTERVAL_SELECTION
quando muda a seleo, gerado um ListSelectionEvent
podem ser associados ListSelectionListeners, que devem
implementar o mtodo valueChanged(ListSelectionEvent)
o mtodo getValueIsAdjusting() retorna true se o utilizador
ainda est a manipular a seleo da JList
int getSelectedIndex() ou int[ ] getSelectedIndices()
permitem saber quais os itens selecionados

Programao Avanada em Java

2012-2013

PAJ03.2

JList alterao de contedo


Juntando e removendo itens
listModel = new DefaultListModel();
listModel.addElement("Jane Doe");
listModel.addElement("John Smith");
list = new JList(listModel);

supondo que o boto fireButton deve apagar o item selecionado (como no


exemplo), a resposta a um click nesse boto seria, p.ex.
public void actionPerformed(ActionEvent e) {
int index = list.getSelectedIndex(); // item selecionado
listModel.remove(index); // apaga-o da lista (NO MODELO!!)
int size = listModel.getSize(); // quantos sobram?
if (size == 0) { //Nobody's left, disable firing.
fireButton.setEnabled(false);
} else { //Select an index.
if (index == listModel.getSize()) {
index--; //removed item in last position
}
list.setSelectedIndex(index); // novo selecionado
list.ensureIndexIsVisible(index); // garante que visvel
}
}

para juntar um item novo:


listModel.insertElementAt(employeeName.getText(), index);
Programao Avanada em Java

2012-2013

PAJ03.2

JList - CellRenderer
CellRenderer
Objeto que sabe desenhar cada um dos itens
A JList tem um CellRenderer de defeito que sabe desenhar icons e strings,
e os outros objetos atravs da invocao de toString
Podemos definir o nosso CellRenderer, escrevendo uma classe que
implemente o interface ListCellRenderer. Tem apenas um mtodo, que
retorna um componente:
Component getListCellRendererComponent( JList<? extends E> list,
E value, int index, boolean isSelected,
boolean cellHasFocus)

list - a JList que estamos a desenhar


value o valor retornado por list.getModel().getElementAt(index).
index o ndice da clula
isSelected - True se a clula est selecionada
cellHasFocus - True se a clula tem o foco

Programao Avanada em Java

2012-2013

PAJ03.2

JList (API)
Inicializao dos dados
JList(), JList(ListModel), JList(Object[ ]), JList(Vector)
void setModel(ListModel), ListModel getModel()
void setListData(Object[ ]), void setListData(Vector)

Apresentao da lista
void setVisibleRowCount(int), int getVisibleRowCount()
nmero de linhas visveis sem scroll
void setLayoutOrientation(int), int getLayoutOrientation()
VERTICAL, HORIZONTAL_WRAP, VERTICAL_WRAP
int getFirstVisibleIndex(), int getLastVisibleIndex()
void ensureIndexIsVisible(int)

Seleo
void addListSelectionListener(ListSelectionListener)
void setSelectedIndex(int), void setSelectedIndices(int[ ]),
void setSelectedValue(Object, boolean), void setSelectionInterval(int, int)
int getSelectedIndex(), int[ ] getSelectedIndices()
Object getSelectedValue(), Object[ ] getSelectedValues()
...
Programao Avanada em Java

2012-2013

PAJ03.2

10

JComboBox
Permite que o utilizador escolha uma opo
Pode permitir ou no a edio do valor escolhido

Exemplo:
String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
//Create the combo box, select item at index 4.
//Indices start at 0, so 4 specifies the pig.
JComboBox petList = new JComboBox(petStrings);
petList.setSelectedIndex(4);
petList.addActionListener(this);

A ComboBox usa um ComboBoxModel


Mtodos da interface ComboBoxModel:
Object getSelectedItem()
void setSelectedItem( Object)
Programao Avanada em Java

2012-2013

PAJ03.2

11

JComboBox - eventos
Atender eventos
ActionEvent
public class ComboBoxDemo ... implements ActionListener {
...
petList.addActionListener(this) {
...
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource();
String petName = (String)cb.getSelectedItem();
updateLabel(petName);
}
...
}

ItemEvent
lanado quando muda o estado (selecionado) de um item

CellRenderer
Pode ser definido um ListCellRenderer medida para desenhar os itens

Programao Avanada em Java

2012-2013

PAJ03.2

12

JComboBox - CellRenderer
Tal como em JList, pode ser definido pelo programador a forma como
representado cada elemento da ComboBox
Tem que implementar o interface ListCellRenderer,
o que implica ter que implementar o mtodo
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
O componente retornado por este mtodo ser usado para representar o
elemento da combo box
A classe que implementa este interface pode estender outra classe, por
exemplo JLabel

Programao Avanada em Java

2012-2013

PAJ03.2

13

JComboBox (API)
Definindo e acedendo aos itens
JComboBox(), JComboBox(ComboBoxModel), JComboBox(Object[ ]),
JComboBox(Vector)
void addItem(Object), void insertItemAt(Object, int)
Object getItemAt(int), Object getSelectedItem()
void removeAllItems(), void removeItemAt(int), void removeItem(Object)
int getItemCount()
void setModel(ComboBoxModel), ComboBoxModel getModel()

Operao

void addActionListener(ActionListener)
void addItemListener(ItemListener)
void setEditable(boolean), boolean isEditable()
void setRenderer(ListCellRenderer), ListCellRenderer getRenderer()
void setEditor(ComboBoxEditor), ComboBoxEditor getEditor()
objeto que gere a edio de texto, quando editvel

Programao Avanada em Java

2012-2013

PAJ03.2

14

JTable
A JTable permite apresentar e editar dados na forma de tabelas

Construtor
JTable table = new JTable(data, columnNames);

Desvantagem:
Todas as clulas so editveis
Todas as clulas so do tipo String
Os dados tm que ser fornecidos num array ou Vector
Alternativa: usar um TableModel

Programao Avanada em Java

2012-2013

PAJ03.2

15

JTable - tamanho
Juntar uma tabela a um JScrollPane:
JScrollPane scrPane = new JScrollPane(table);
table.setFillsViewportHeight(true);

O scroll pane automaticamente coloca o cabealho com o nome das


colunas no topo, e garante que fica visvel quando se faz scroll da tabela

Largura das colunas


por defeito as colunas tm larguras iguais
ao criar a tabela podem ser definidas larguras diferentes, invocando
setPreferredWidth para cada coluna
as colunas so guardadas num TableColumnModel
cada coluna representada por um objeto do tipo TableColumn
TableColumn column = null;
for (int i = 0; i < 5; i++) {
column = table.getColumnModel().getColumn(i);
if (i == 2) {
column.setPreferredWidth(100); //third column is bigger
} else {
column.setPreferredWidth(50);
}
}

Programao Avanada em Java

2012-2013

PAJ03.2

16

JTable - TableColumn
Cada JTable tem um TableColumnModel, que tem uma coleo de
TableColumn
Cada TableColumn caracteriza uma coluna da JTable
TableCellEditor getCellEditor(),
void setCellEditor(TableCellEditor cellEditor)
TableCellRenderer getCellRenderer(),
void setCellRenderer(TableCellRenderer cellRenderer)
TableCellRenderer getHeaderRenderer(),
void setHeaderRenderer(TableCellRenderer headerRenderer)
Object getHeaderValue(), void setHeaderValue(Object headerValue)
int getMaxWidth(), void setMaxWidth(int maxWidth)
int getMinWidth(), void setMinWidth(int minWidth)
int getModelIndex(), void setModelIndex(int modelIndex)
int getPreferredWidth(), void setPreferredWidth(int preferredWidth)
boolean getResizable(), void setResizable(boolean isResizable)
int getWidth(), void setWidth(int width)
void sizeWidthToFit()

Programao Avanada em Java

2012-2013

PAJ03.2

17

TableModel
Todas as tabelas usam um TableModel para gerir os dados
Se nada for dito, usam um DefaultTableModel

Eventos gerados por TableModel


alterao nos dados da tabela: informa os TableModelListener
tm que implementar o mtodo void tableChanged(TableModelEvent e)
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
TableModel model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object data = model.getValueAt(row, column);
...// Do something with the data...
}
Programao Avanada em Java

2012-2013

PAJ03.2

18

AbstractTableModel
Normalmente implementa-se o TableModel estendendo a classe
AbstractTableModel
Exemplo simples:
class MeuTableModel extends AbstractTableModel {
public String getColumnName(int col) {
return columnNames[col].toString();
}
public int getRowCount() { return rowData.length; }
public int getColumnCount() { return columnNames.length; }
public Object getValueAt(int row, int col) { return rowData[row][col]; }
public boolean isCellEditable(int row, int col) { return true; }
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public void setValueAt(Object value, int row, int col) {
rowData[row][col] = value;
fireTableCellUpdated(row, col);
}
}

Programao Avanada em Java

2012-2013

PAJ03.2

19

Data Change Events


Quando os dados so alterados, o TableModel tem que lanar os
eventos apropriados para informar os TableModelListener
O AbstractTableModel implementa mtodos que suportam esta
funcionalidade
Mais uma razo para estendermos a classe AbstractTableModel, em vez
de programar uma classe a partir do zero

fireTableCellUpdated

Update of specified cell.

fireTableRowsUpdated

Update of specified rows

fireTableDataChanged

Update of entire table (data only)

fireTableRowsInserted

New rows inserted

fireTableRowsDeleted

Existing rows Deleted

fireTableStructureChanged

Invalidate entire table, both data and structure

Programao Avanada em Java

2012-2013

PAJ03.2

20

Editors e Renderers
Por razes de eficincia as clulas das tabelas no so componentes
Um mesmo cell renderer normalmente usado para desenhar todas as
clulas de um dado tipo
Um cell editor trata da edio do contedo
Exemplo: por defeito uma clula do tipo Integer desenhada com uma
JLabel; se o utilizador comear a editar a clula, o editor usa um JTextField
alinhado direita
O utilizador pode definir o cell renderer a usar em cada coluna. Se o no
fizer, escolhido automaticamente um dependente do tipo de coluna:
Boolean

check box

Number

label alinhada direita

Double, Float

como Number, mas usa um NumberFormat para converter para String

Date

label, mas usa um DateFormat para converter para String

ImageIcon, Icon

label alinhada ao centro

Object

label que mostra o valor retornado por toString

Programao Avanada em Java

2012-2013

PAJ03.2

21

JComboBox como cell editor


Pode ser usada uma combo box como editor da clula
TableColumn sportColumn = table.getColumnModel().getColumn(2);
...
JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Chasing toddlers");
comboBox.addItem("Speed reading");
comboBox.addItem("Teaching high school");
comboBox.addItem("None");
sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

Programao Avanada em Java

2012-2013

PAJ03.2

22

Menus - JMenuBar
Hierarquia de classes

Como criar uma barra de menu,


associando-a frame:
JMenuBar menuBar = new JMenuBar();
...
frame.setJMenuBar(menuBar);

Programao Avanada em Java

2012-2013

PAJ03.2

23

Menus - exemplo
Nos diapositivos seguintes vo ser apresentados fragmentos do cdigo
que cria o menu seguinte:

Programao Avanada em Java

2012-2013

PAJ03.2

24

JMenu JMenuItem
menu bar pode ser associado um menu
o exemplo cria uma menu bar, cria um menu, e associa o menu menu
bar
JMenuBar menuBar;
JMenu menu, submenu;
...
//Create the menu bar.
menuBar = new JMenuBar();
//Build the first menu.
menu = new JMenu("A Menu");
menu.setMnemonic(KeyEvent.VK_A);
menuBar.add(menu);

o exemplo seguinte cria menu items, e associa-os a um menu


menuItem = new JMenuItem("A text-only menu item",
KeyEvent.VK_T);
menu.add(menuItem);
menuItem = new JMenuItem("Both text and icon",
new ImageIcon("images/middle.gif"));
menuItem.setMnemonic(KeyEvent.VK_B);
menu.add(menuItem);
menuItem = new JMenuItem(new ImageIcon("images/middle.gif"));
menuItem.setMnemonic(KeyEvent.VK_D);
menu.add(menuItem);
Programao Avanada em Java

2012-2013

PAJ03.2

25

JRadioButtonMenuItem JCheckBoxMenuItem
Um exemplo de insero de um separador, e radio buttons
//a group of radio button menu items
menu.addSeparator();
ButtonGroup group = new ButtonGroup();
rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
rbMenuItem.setSelected(true);
rbMenuItem.setMnemonic(KeyEvent.VK_R);
group.add(rbMenuItem);
menu.add(rbMenuItem);
rbMenuItem = new JRadioButtonMenuItem("Another one");
rbMenuItem.setMnemonic(KeyEvent.VK_O);
group.add(rbMenuItem);
menu.add(rbMenuItem);

Um exemplo de insero de um separador, e check boxes


//a group of check box menu items
menu.addSeparator();
cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
cbMenuItem.setMnemonic(KeyEvent.VK_C);
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Another one");
cbMenuItem.setMnemonic(KeyEvent.VK_H);
menu.add(cbMenuItem);

Programao Avanada em Java

2012-2013

PAJ03.2

26

Submenu Eventos
Para criar um submenu, basta juntar um menu (o submenu) a outro
//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
submenu.setMnemonic(KeyEvent.VK_S);
menuItem = new JMenuItem("An item in the submenu");
menuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_2, ActionEvent.ALT_MASK));
submenu.add(menuItem);
menuItem = new JMenuItem("Another item");
submenu.add(menuItem);
menu.add(submenu);

Para receber eventos: implementam-se listeners correspondentes:


JMenuItem: ActionEvent
JRadioButtonMenuItem: ActionEvent ou ItemEvent
JCheckBoxMenuItems: ItemEvent

Programao Avanada em Java

2012-2013

PAJ03.2

27

JPopupMenu
Tem que se registar um MouseListener com cada elemento a que
queremos associar o popup menu
Criar o popup menu ( como os menus normais)
popup = new JPopupMenu();
menuItem = new JMenuItem("A popup menu item");
menuItem.addActionListener(this);
popup.add(menuItem);
menuItem = new JMenuItem("Another popup menu item");
menuItem.addActionListener(this);
popup.add(menuItem);

Registar um listener com os componentes associados ao popup menu


//Add listener to components that can bring up popup menus.
MouseListener popupListener = new PopupListener();
output.addMouseListener(popupListener);

Mostrar o popup menu quando se clicar o boto do rato (como exemplo)


class PopupListener extends MouseAdapter {
public void mousePressed(MouseEvent e) { maybeShowPopup(e); }
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
Programao Avanada em Java

2012-2013

PAJ03.2

28

Borders
Para criar borders, recomenda-se usar a BorderFactory
blackline = BorderFactory.createLineBorder(Color.black);
raisedetched = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
loweredetched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
raisedbevel = BorderFactory.createRaisedBevelBorder();
loweredbevel = BorderFactory.createLoweredBevelBorder();
empty = BorderFactory.createEmptyBorder();
title = BorderFactory.createTitledBorder( blackline, "title");

componente.setBorder(raisedbevel);

Programao Avanada em Java

2012-2013

PAJ03.2

29

JColorChooser
Para escolher uma cor de forma interativa

Exemplo usando um Dialog


Color newColor = JColorChooser.showDialog(
ColorChooserDemo2.this,
"Choose Background Color",
banner.getBackground());
if (newColor != null) {
banner.setBackground(newColor);
}
Programao Avanada em Java

2012-2013

PAJ03.2

30

JFileChooser
Para selecionar um ficheiro
Cria-se um objeto FileChooser
Invoca-se o mtodo
showOpenDialog, que torna
o dilogo visvel
o mtodo retorna quando o
utilizador fecha o dilogo
testa-se se terminou validando
ou no (Open ou Cancel)
//Create a file chooser
final JFileChooser fc = new JFileChooser();
...
int returnVal = fc.showOpenDialog(aComponent); // componente pai
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();

// processar o ficheiro...
}

fc.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY);

Programao Avanada em Java

2012-2013

PAJ03.2

31

JFileChooser - FileFilter
Para selecionar os ficheiros a mostrar.
O filtro tem que implementar o interface FileFilter, que obriga a
implementar os mtodos accept e getDescription
Exemplo que aceita apenas ficheiros com imagens:
public class ImageFilter extends FileFilter {
//Accept all directories and all gif, jpg, tiff, or png files.
public boolean accept(File f) {
if (f.isDirectory()) { return true; }
String extension = Utils.getExtension(f);
if (extension != null) {
if (extension.equals(Utils.tiff) ||
extension.equals(Utils.tif) ||
extension.equals(Utils.gif) ||
extension.equals(Utils.jpeg) ||
extension.equals(Utils.jpg) ||
extension.equals(Utils.png)) {
return true;
} else { return false; }
}
return false;
}
public String getDescription() {
return "Just Images";
}
Programao Avanada em Java

2012-2013

PAJ03.2

32

Grficos
Vamos abordar alguns conceitos, o que no dispensa a consulta
documentao da API, tutoriais ou outras fontes de informao
Espaos de coordenadas:
User space O espao no qual as primitivas grficas so especificadas
Device space O sistema de coordenadas do dispositivo, tal como um
monitor, uma janela ou uma impressora

O user space um sistema de coordenadas lgicas independente do


dispositivo. Todas as geometrias passadas aos mtodos Java so
especificadas em termos de coordenadas neste espao
A origem das coordenadas no user space o canto superior esquerdo
da rea de desenho do componente

Programao Avanada em Java

2012-2013

PAJ03.2

33

Rendering (renderizao)
A API Java 2D, que inclui a classe java.awt.Graphics2D, garante que o
processo de renderizao (composio da imagem) a mesma para
qualquer dispositivo (monitor, impressora, etc.). Inclui:
Renderizao do contorno das formas geomtricas primitivas, usando
atributos de trao e cor (mtodo draw)
Renderizao de formas geomtricas primitivas preenchendo o seu interior
com a cor e padro especificados (mtodo fill)
Renderizao de texto (mtodo drawString); o atributo font usado para
converter o texto em smbolos, que so preenchidos com a cor e padro
especificados
Renderizao de imagem (mtodo drawImage)

A classe Graphics2D deriva da classe Graphics, e mais flexvel e


poderosa

Programao Avanada em Java

2012-2013

PAJ03.2

34

Formas grficas primitivas Point, Line


Point
representa uma localizao no espao de coordenadas (x,y)
Point, Point2D.Float, Point2D.Double
// Create Point
Point p = new Point( 50, 120);

Line2D
representa um segmento de reta no espao de coordenadas (x,y)
Line2D.Float, Line2D.Double
so dadas as coordenadas de cada extremo
// draw Line2D.Double
g2.draw(new Line2D.Double(10, 10, 100, 150));

Programao Avanada em Java

2012-2013

PAJ03.2

35

Formas grficas primitivas - Rectangle


Rectangle

representa um retngulo no espao de coordenadas (x,y)


Rectangle, Rectangle2D.Float, Rectangle2D.Double
draw: apenas o contorno
fill: preenche a rea
// draw Rectangle2D.Double
g2.draw(new Rectangle2D.Double(x, y,
rectwidth,
rectheight));

RoundRectangle
representa um retngulo de cantos arredondados
RoundRectangle, RoundRectangle2D.Float, RoundRectangle2D.Double
// draw RoundRectangle2D.Double
g2.draw(new RoundRectangle2D.Double(
x, y,
rectwidth, rectheight,
arcWidth, arcHeight));

Programao Avanada em Java

2012-2013

PAJ03.2

36

Formas grficas primitivas Ellipse, Arc


Ellipse

representa uma elipse definida por um retngulo que a engloba


Ellipse2D.Float, Ellipse2D.Double
draw: desenha apenas o contorno
fill: preenche a rea
// draw Ellipse2D.Double
g2.draw(new Ellipse2D.Double(x, y,
rectwidth,
rectheight));

Arc
Para desenhar parte de uma elipse. A elipse definida por um retngulo, e
define-se ainda um ngulo de incio do arco, um arco de extenso, e a
forma de fecho
// draw Arc2D.Double
g2.draw(new Arc2D.Double(x, y,
rectwidth,rectheight,
90, 135,
Arc2D.OPEN));

Programao Avanada em Java

2012-2013

PAJ03.2

37

Renderizao exemplo 1
Exemplo de desenho de um retngulo de cantos arredondados com
trao interrompido
g2: contexto grfico (graphics context) onde feito o desenho
dashed: stroke, ou seja, o tipo de trao a usar no desenho
draw: mtodo que faz o desenho com as condies especificadas
// draw RoundRectangle2D.Double
final static float dash1[] = {10.0f};
final static BasicStroke dashed =
new BasicStroke(1.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER,
10.0f, dash1, 0.0f);
g2.setStroke(dashed);
g2.draw(new RoundRectangle2D.Double(x, y,
rectWidth,
rectHeight,
10, 10));

Programao Avanada em Java

2012-2013

PAJ03.2

38

Renderizao exemplo 2
Exemplo de desenho de uma elipse preenchida com um gradiente de
cor
g2: contexto grfico (graphics context) onde feito o desenho
redtowhite: o gradiente a usar para preencher o espao da elipse
fill: mtodo que desenha a elipse e preenche o interior com a cor
especificada; o mtodo drw permitiria desenhar apenas o contorno da
elipse, sem pintar o interior

// fill Ellipse2D.Double
redtowhite = new GradientPaint(0,0,color.RED,100,0,color.WHITE);
g2.setPaint(redtowhite);
g2.fill (new Ellipse2D.Double(0, 0, 100, 50));

Programao Avanada em Java

2012-2013

PAJ03.2

39

Fontes
Fontes fsicas
Contm a informao (smbolos e tabelas) que permitem converter
sequncias de caracteres em sequncias de smbolos, p.ex., TrueType
Para conhecer as fontes instaladas:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilies = ge.getAvailableFontFamilyNames();

Fontes lgicas
Em Java:
Dialog
DialogInput
Monospaced
Serif
SansSerif

Programao Avanada em Java

2012-2013

PAJ03.2

40

Escrita de texto (cont.)


Font

classe que representa uma fonte


font family: p.ex. Helvetica
font face: p.ex. normal, bold, italic
font name: p.ex. Helvetica Bold
Construtor: Font( String name, int style, int size)
name: pode ser font family name ou font face name
constante de estilo para a fonte; bitmapped; PLAIN, BOLD, ITALIC
size: tamanho em pontos

Definir a fonte a usar (vlido para Graphics como para componentes


de texto, como por exemplo JLabel ou JTextPane
textTestPanel.setFont(new Font(fontChoice, styleChoice, sizeChoice));

Programao Avanada em Java

2012-2013

PAJ03.2

41

Escrita de texto
Mtricas so medidas do texto renderizado por uma fonte, como por
exemplo a altura de uma linha de texto
A forma mais simples de medir texto usar uma instncia de FontMetrics
// get metrics from the graphics
FontMetrics metrics = graphics.getFontMetrics(font);
// get the height of a line of text in this font and render context
int hgt = metrics.getHeight();
// get the advance of my text in this font and render context
int adv = metrics.stringWidth(text);
// calculate the size of a box to hold the text with some padding.
Dimension size = new Dimension(adv+2, hgt+2);

Escrever texto:
g2.setFont( fonteEscolhida);
g2.drawString(String s, int x, int y);

Anti-aliasing
g2.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

Programao Avanada em Java

2012-2013

PAJ03.2

42

Imagens - Image e BufferedImage


Na API Java 2D uma imagem tipicamente um array bidimensional
retangular de pixels; cada pixel representa a cor da imagem na
respetiva posio; as dimenses representam a extenso horizontal
(largura, width) e vertical (altura, height) da imagem quando
desenhada
Principal classe a usar: java.awt.image.BufferedImage
deriva de Image
A classe BufferedImage fundamental no mbito da API Java 2D. Gere a
imagem em memria e disponibiliza mtodos para armazenar, interpretar, e
obter informao. Dado que BufferedImage derivada de Image, pode ser
usada por todos os mtodos de Graphics e Graphics2D que esperam um
parmetro do tipo Image.

Carregar uma imagem de disco


BufferedImage img = null;
try {
img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
}

Programao Avanada em Java

2012-2013

PAJ03.2

43

Imagens - desenhar
Desenhar uma imagem
observer pode ser null, na maior parte dos casos
boolean Graphics.drawImage(Image img, int x, int y,
ImageObserver observer);

Desenhar parte de uma imagem e/ou escalar a imagem


dstx1, dsty1, dstx2, dsty2: coordenadas da rea onde a imagem vai ser
desenhada
srcx1, srcy1, srcx2, srcy2: rea da imagem que vai ser desenhada
boolean Graphics.drawImage(Image img,
int dstx1, int dsty1, int dstx2, int dsty2,
int srcx1, int srcy1, int srcx2, int srcy2,
ImageObserver observer);

Programao Avanada em Java

2012-2013

PAJ03.2

44

Imagens criar em memria


Criar uma imagem (rea de desenho) em memria
new BufferedImage(width, height, type)
type: TYPE_INT_ARGB, TYPE_INT_RGB, ...
ou pedir a um objeto (p.ex. componente) que crie uma imagem compatvel
Component.createImage(width, height)
GraphicsConfiguration.createCompatibleImage(width, height)
GraphicsConfiguration.createCompatibleImage(width, height,
transparency)

Desenhar numa imagem em memria


BufferedImage off_Image =
new BufferedImage(100, 50, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = off_Image.createGraphics();

createGraphics retorna um objeto do tipo Graphics2D que podemos usar


para desenhar na imagem off_Image
o grfico pode depois ser apresentado ao utilizador por exemplo numa
JLabel, gravado, e/ou impresso

Programao Avanada em Java

2012-2013

PAJ03.2

45

Imagens - gravar
Gravar uma imagem
static boolean ImageIO.write(RenderedImage im,
String formatName,
File output) throws IOException
BufferedImage implementa o interface RenderedImage
Exemplo:
try {
// retrieve image
BufferedImage bi = ...; // criada uma imagem em memria
File outputfile = new File("saved.png");
ImageIO.write(bi, "png", outputfile);
} catch (IOException e) {
...
}

Formatos disponveis (pode haver mais plugins instalados)


JPEG, PNG, GIF, BMP, WBMP

Programao Avanada em Java

2012-2013

PAJ03.2

46

You might also like