java swing

46
Programação Avançada em Java 2012-2013 PAJ03.2 1 Programação Avançada em Java 2012-2013 PAJ03.2 1 JButton Deriva de AbstractButton Pode mostrar texto e imagem A letra sublinhada indica a mnemónica ( keyboard shotcut) Pode ser definido um botão selecionado por defeito ( setDefaultButton) no contentor de alto nível dos botões (p.ex. JFrame ou JDialog) Os botões disabled têm aspeto diferente Código 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);

Upload: kelve-aragao

Post on 16-Dec-2015

242 views

Category:

Documents


2 download

DESCRIPTION

Apresentação sobre swing.

TRANSCRIPT

  • Programao Avanada em Java 2012-2013 PAJ03.2 1Programao Avanada em Java 2012-2013 PAJ03.2 1

    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 2Programao Avanada em Java 2012-2013 PAJ03.2 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 3Programao Avanada em Java 2012-2013 PAJ03.2 3

    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 definidabirdButton.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 4Programao Avanada em Java 2012-2013 PAJ03.2 4

    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 5Programao Avanada em Java 2012-2013 PAJ03.2 5

    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 6Programao Avanada em Java 2012-2013 PAJ03.2 6

    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 7Programao Avanada em Java 2012-2013 PAJ03.2 7

    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 8Programao Avanada em Java 2012-2013 PAJ03.2 8

    JList alterao de contedo Juntando e removendo itens

    supondo que o boto fireButton deve apagar o item selecionado (como no exemplo), a resposta a um click nesse boto seria, p.ex.

    para juntar um item novo:

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

    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 }}

    listModel.insertElementAt(employeeName.getText(), index);

  • Programao Avanada em Java 2012-2013 PAJ03.2 9Programao Avanada em Java 2012-2013 PAJ03.2 9

    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

  • Programao Avanada em Java 2012-2013 PAJ03.2 10Programao Avanada em Java 2012-2013 PAJ03.2 10

    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 11Programao Avanada em Java 2012-2013 PAJ03.2 11

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

    Exemplo:

    A ComboBox usa um ComboBoxModel Mtodos da interface ComboBoxModel: Object getSelectedItem() void setSelectedItem( Object)

    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);

  • Programao Avanada em Java 2012-2013 PAJ03.2 12Programao Avanada em Java 2012-2013 PAJ03.2 12

    JComboBox - eventos Atender eventos

    ActionEvent

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

    CellRenderer Pode ser definido um ListCellRenderer medida para desenhar os itens

    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); } ...}

  • Programao Avanada em Java 2012-2013 PAJ03.2 13Programao Avanada em Java 2012-2013 PAJ03.2 13

    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 mtodopublic 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 14Programao Avanada em Java 2012-2013 PAJ03.2 14

    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 15Programao Avanada em Java 2012-2013 PAJ03.2 15

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

    Construtor

    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

    JTable table = new JTable(data, columnNames);

  • Programao Avanada em Java 2012-2013 PAJ03.2 16Programao Avanada em Java 2012-2013 PAJ03.2 16

    JTable - tamanho Juntar uma tabela a um JScrollPane:

    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

    JScrollPane scrPane = new JScrollPane(table);table.setFillsViewportHeight(true);

    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 17Programao Avanada em Java 2012-2013 PAJ03.2 17

    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 18Programao Avanada em Java 2012-2013 PAJ03.2 18

    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 19Programao Avanada em Java 2012-2013 PAJ03.2 19

    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 20Programao Avanada em Java 2012-2013 PAJ03.2 20

    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 21Programao Avanada em Java 2012-2013 PAJ03.2 21

    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 22Programao Avanada em Java 2012-2013 PAJ03.2 22

    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 23Programao Avanada em Java 2012-2013 PAJ03.2 23

    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 24Programao Avanada em Java 2012-2013 PAJ03.2 24

    Menus - exemplo Nos diapositivos seguintes vo ser apresentados fragmentos do cdigo

    que cria o menu seguinte:

  • Programao Avanada em Java 2012-2013 PAJ03.2 25Programao Avanada em Java 2012-2013 PAJ03.2 25

    JMenu JMenuItem menu bar pode ser associado um menu

    o exemplo cria uma menu bar, cria um menu, e associa o menu menu bar

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

    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);

    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 26Programao Avanada em Java 2012-2013 PAJ03.2 26

    JRadioButtonMenuItem JCheckBoxMenuItem Um exemplo de insero de um separador, e radio buttons

    Um exemplo de insero de um separador, e check boxes

    //a group of radio button menu itemsmenu.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);

    //a group of check box menu itemsmenu.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 27Programao Avanada em Java 2012-2013 PAJ03.2 27

    Submenu Eventos Para criar um submenu, basta juntar um menu (o submenu) a outro

    Para receber eventos: implementam-se listeners correspondentes: JMenuItem: ActionEvent JRadioButtonMenuItem: ActionEvent ou ItemEvent JCheckBoxMenuItems: ItemEvent

    //a submenumenu.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);

  • Programao Avanada em Java 2012-2013 PAJ03.2 28Programao Avanada em Java 2012-2013 PAJ03.2 28

    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)

    Registar um listener com os componentes associados ao popup menu

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

    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);

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

    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 29Programao Avanada em Java 2012-2013 PAJ03.2 29

    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 30Programao Avanada em Java 2012-2013 PAJ03.2 30

    JColorChooser Para escolher uma cor de forma interativa

    Exemplo usando um DialogColor newColor = JColorChooser.showDialog( ColorChooserDemo2.this, "Choose Background Color", banner.getBackground());if (newColor != null) { banner.setBackground(newColor);}

  • Programao Avanada em Java 2012-2013 PAJ03.2 31Programao Avanada em Java 2012-2013 PAJ03.2 31

    JFileChooser Para selecionar um ficheiro

    Cria-se um objeto FileChooser Invoca-se o mtodo

    showOpenDialog, que tornao dilogo visvel

    o mtodo retorna quando outilizador fecha o dilogo

    testa-se se terminou validandoou no (Open ou Cancel)

    Para visualizar apenas diretrios

    //Create a file chooserfinal JFileChooser fc = new JFileChooser();...int returnVal = fc.showOpenDialog(aComponent); // componente paiif (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); // processar o ficheiro...}

    fc.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY);

  • Programao Avanada em Java 2012-2013 PAJ03.2 32Programao Avanada em Java 2012-2013 PAJ03.2 32

    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 33Programao Avanada em Java 2012-2013 PAJ03.2 33

    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 34Programao Avanada em Java 2012-2013 PAJ03.2 34

    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 35Programao Avanada em Java 2012-2013 PAJ03.2 35

    Formas grficas primitivas Point, Line Point

    representa uma localizao no espao de coordenadas (x,y) Point, Point2D.Float, Point2D.Double

    Line2D representa um segmento de reta no espao de coordenadas (x,y) Line2D.Float, Line2D.Double so dadas as coordenadas de cada extremo

    // Create PointPoint p = new Point( 50, 120);

    // draw Line2D.Doubleg2.draw(new Line2D.Double(10, 10, 100, 150));

  • Programao Avanada em Java 2012-2013 PAJ03.2 36Programao Avanada em Java 2012-2013 PAJ03.2 36

    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

    RoundRectangle representa um retngulo de cantos arredondados RoundRectangle, RoundRectangle2D.Float, RoundRectangle2D.Double

    // draw Rectangle2D.Doubleg2.draw(new Rectangle2D.Double(x, y, rectwidth, rectheight));

    // draw RoundRectangle2D.Doubleg2.draw(new RoundRectangle2D.Double(

    x, y, rectwidth, rectheight, arcWidth, arcHeight));

  • Programao Avanada em Java 2012-2013 PAJ03.2 37Programao Avanada em Java 2012-2013 PAJ03.2 37

    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

    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 Ellipse2D.Doubleg2.draw(new Ellipse2D.Double(x, y, rectwidth, rectheight));

    // draw Arc2D.Doubleg2.draw(new Arc2D.Double(x, y, rectwidth,rectheight, 90, 135, Arc2D.OPEN));

  • Programao Avanada em Java 2012-2013 PAJ03.2 38Programao Avanada em Java 2012-2013 PAJ03.2 38

    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 39Programao Avanada em Java 2012-2013 PAJ03.2 39

    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.Doubleredtowhite = 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 40Programao Avanada em Java 2012-2013 PAJ03.2 40

    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:

    Fontes lgicas Em Java:

    Dialog DialogInput Monospaced Serif SansSerif

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();String[] fontFamilies = ge.getAvailableFontFamilyNames();

  • Programao Avanada em Java 2012-2013 PAJ03.2 41Programao Avanada em Java 2012-2013 PAJ03.2 41

    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 42Programao Avanada em Java 2012-2013 PAJ03.2 42

    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

    Escrever texto:

    Anti-aliasing

    // get metrics from the graphicsFontMetrics metrics = graphics.getFontMetrics(font);// get the height of a line of text in this font and render contextint hgt = metrics.getHeight();// get the advance of my text in this font and render contextint 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);

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

    g2.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

  • Programao Avanada em Java 2012-2013 PAJ03.2 43Programao Avanada em Java 2012-2013 PAJ03.2 43

    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 44Programao Avanada em Java 2012-2013 PAJ03.2 44

    Imagens - desenhar Desenhar uma imagem

    observer pode ser null, na maior parte dos casos

    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 x, int y, ImageObserver observer);

    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 45Programao Avanada em Java 2012-2013 PAJ03.2 45

    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

    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

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

    Graphics2D g2 = off_Image.createGraphics();

  • Programao Avanada em Java 2012-2013 PAJ03.2 46Programao Avanada em Java 2012-2013 PAJ03.2 46

    Imagens - gravar Gravar uma imagem

    static boolean ImageIO.write(RenderedImage im,String formatName,File output) throws IOException

    BufferedImage implementa o interface RenderedImage Exemplo:

    Formatos disponveis (pode haver mais plugins instalados) JPEG, PNG, GIF, BMP, WBMP

    try { // retrieve image BufferedImage bi = ...; // criada uma imagem em memria File outputfile = new File("saved.png"); ImageIO.write(bi, "png", outputfile);} catch (IOException e) { ...}

    Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33Slide 34Slide 35Slide 36Slide 37Slide 38Slide 39Slide 40Slide 41Slide 42Slide 43Slide 44Slide 45Slide 46