Description

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); Programação Avançada em Java 2012-2013 PAJ03.2 1 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(); } Programação Avançada em Java 2012-2013 PAJ03.2 2 JRadioButton • Deriva de AbstractButton • Semelhante a JCheckBox, mas em cada momento só um botão 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 opção 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")); } Programação Avançada em Java 2012-2013 PAJ03.2 3 Botões (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 botão – public ButtonGroup clearSelection() • limpa o estado selected dos botões do grupo Programação Avançada em Java 2012-2013 PAJ03.2 4 Botões (API cont. boolean isSelected() – void addActionListener(ActionListener). int getHorizontalAlignment(). … Programação Avançada em Java 2012-2013 PAJ03.2 5 .) • Conteúdo do botão – – – – void setAction(Action). int getVerticalTextPosition() – void setMargin(Insets). void setVerticalAlignment(int). void setVerticalTextPosition(int). int getVerticalAlignment() – void setHorizontalTextPosition(int). int getHorizontalTextPosition(). ItemListener removeItemListener() – void setMnemonic(int). Icon getDisabledIcon(). Action getAction() void setText(String). ActionListener removeActionListener() – void addItemListener(ItemListener). int getIconTextGap() • Funcionalidade – void setSelected(boolean). Icon getIcon() void setDisabledIcon(Icon). char getMnemonic(). Insets getMargin() – void setIconTextGap(int). … • Aspeto – void setHorizontalAlignment(int). String getText() void setIcon(Icon). list. um ListModel imutável.setLayoutOrientation(JList.HORIZONTAL_WRAP).2 6 . é automaticamente criado. serve para a maior parte das aplicações – Se o construtor inicializar a JList com um array ou um Vector. que armazena os dados – ListModel: interface – AbstractListModel: o programador gere os dados e invoca os métodos “fire”. Programação Avançada em Java 2012-2013 PAJ03. • Exemplo de uso de uma JList: JList list = new JList(data). em uma ou mais colunas • A JList tem associado um ListModel.SINGLE_INTERVAL_SELECTION). list. //data has type Object[] list.JList • A JList apresenta um grupo de itens. e é-lhe associado.setSelectionMode(ListSelectionModel. Tem que estender a classe abstrata AbstractListModel e implementar os métodos getSize e getElementAt – DefaultListModel: está tudo tratado.setVisibleRowCount(-1). é gerado um ListSelectionEvent – podem ser associados ListSelectionListeners.JList – seleção de elementos • Seleção de itens – setSelectionMode • SINGLE_SELECTION • SINGLE_INTERVAL_SELECTION • MULTIPLE_INTERVAL_SELECTION – quando muda a seleção. que devem implementar o método valueChanged(ListSelectionEvent) – o método getValueIsAdjusting() retorna true se o utilizador ainda está a manipular a seleção da JList – int getSelectedIndex() ou int[ ] getSelectedIndices() permitem saber quais os itens selecionados Programação Avançada em Java 2012-2013 PAJ03.2 7 . } else { //Select an index. a resposta a um click nesse botão seria. index). Programação Avançada em Java 2012-2013 PAJ03.ensureIndexIsVisible(index). public void actionPerformed(ActionEvent e) { int index = list.JList – alteração de conteúdo • Juntando e removendo itens listModel = new DefaultListModel(). listModel. // garante que é visível } } – para juntar um item novo: listModel.insertElementAt(employeeName.remove(index). p.getText(). list = new JList(listModel).setEnabled(false).getSize()) { index--.addElement("Jane Doe").addElement("John Smith"). fireButton. listModel.getSelectedIndex().2 8 . – supondo que o botão fireButton deve apagar o item selecionado (como no exemplo).setSelectedIndex(index). if (index == listModel. //removed item in last position } list.getSize(). // item selecionado listModel.ex. // novo selecionado list. // quantos sobram? if (size == 0) { //Nobody's left. disable firing. // apaga-o da lista (NO MODELO!!) int size = listModel. 2 9 .getModel(). E value. index – o índice da célula isSelected .getElementAt(index). Tem apenas um método.a JList que estamos a desenhar value – o valor retornado por list. int index. e os outros objetos através da invocação de toString – Podemos definir o nosso CellRenderer.True se a célula está selecionada cellHasFocus . boolean cellHasFocus) – – – – – list .JList . boolean isSelected. escrevendo uma classe que implemente o interface ListCellRenderer.CellRenderer • CellRenderer – Objeto que sabe desenhar cada um dos itens – A JList tem um CellRenderer de defeito que sabe desenhar icons e strings. que retorna um componente: • Component getListCellRendererComponent( JList<? extends E> list.True se a célula tem o foco Programação Avançada em Java 2012-2013 PAJ03. int getLastVisibleIndex() – void ensureIndexIsVisible(int) • Seleção – void addListSelectionListener(ListSelectionListener) – void setSelectedIndex(int). int getLayoutOrientation() • VERTICAL. Object[ ] getSelectedValues() – . Programação Avançada em Java 2012-2013 PAJ03. void setListData(Vector) • Apresentação da lista – void setVisibleRowCount(int). JList(Object[ ]). int getVisibleRowCount() • número de linhas visíveis sem scroll – void setLayoutOrientation(int). HORIZONTAL_WRAP. void setSelectedIndices(int[ ]).2 10 . JList(Vector) – void setModel(ListModel). int[ ] getSelectedIndices() – Object getSelectedValue().. void setSelectionInterval(int. int) – int getSelectedIndex().JList (API) • Inicialização dos dados – JList(). ListModel getModel() – void setListData(Object[ ]). JList(ListModel). VERTICAL_WRAP – int getFirstVisibleIndex(). void setSelectedValue(Object. boolean).. petList. "Rabbit".addActionListener(this). "Cat". – A ComboBox usa um ComboBoxModel • Métodos da interface ComboBoxModel: – Object getSelectedItem() – void setSelectedItem( Object) Programação Avançada em Java 2012-2013 PAJ03. //Create the combo box. "Pig" }. petList. select item at index 4. //Indices start at 0. JComboBox petList = new JComboBox(petStrings). "Dog".JComboBox • Permite que o utilizador escolha uma opção • Pode permitir ou não a edição do valor escolhido – Exemplo: String[] petStrings = { "Bird". so 4 specifies the pig.setSelectedIndex(4).2 11 . .getSource()..addActionListener(this) { . } – ItemEvent • lançado quando muda o estado (selecionado) de um item • CellRenderer – Pode ser definido um ListCellRenderer à medida para desenhar os itens Programação Avançada em Java 2012-2013 PAJ03.2 12 . public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e... implements ActionListener { . String petName = (String)cb....eventos • Atender eventos – ActionEvent public class ComboBoxDemo . petList. } . updateLabel(petName)..getSelectedItem().JComboBox . boolean cellHasFocus) – O componente retornado por este método será usado para representar o elemento da combo box – A classe que implementa este interface pode estender outra classe. boolean isSelected.JComboBox . int index. Object value.2 13 . pode ser definido pelo programador a forma como é representado cada elemento da ComboBox – Tem que implementar o interface ListCellRenderer.CellRenderer • Tal como em JList. o que implica ter que implementar o método public Component getListCellRendererComponent( JList list. por exemplo JLabel Programação Avançada em Java 2012-2013 PAJ03. JComboBox(ComboBoxModel). JComboBox(Object[ ]).2 14 . void removeItem(Object) – int getItemCount() – void setModel(ComboBoxModel). void removeItemAt(int). ComboBoxEditor getEditor() • objeto que gere a edição de texto. ListCellRenderer getRenderer() void setEditor(ComboBoxEditor).JComboBox (API) • Definindo e acedendo aos itens – JComboBox(). void insertItemAt(Object. JComboBox(Vector) – void addItem(Object). quando é editável Programação Avançada em Java 2012-2013 PAJ03. Object getSelectedItem() – void removeAllItems(). int) – Object getItemAt(int). boolean isEditable() void setRenderer(ListCellRenderer). ComboBoxModel getModel() • Operação – – – – – void addActionListener(ActionListener) void addItemListener(ItemListener) void setEditable(boolean). columnNames). – Desvantagem: • Todas as células são editáveis • Todas as células são do tipo String • Os dados têm que ser fornecidos num array ou Vector – Alternativa: usar um TableModel Programação Avançada em Java 2012-2013 PAJ03.JTable • A JTable permite apresentar e editar dados na forma de tabelas • Construtor JTable table = new JTable(data.2 15 . setFillsViewportHeight(true). e garante que fica visível quando se faz scroll da tabela • Largura das colunas – por defeito as colunas têm larguras iguais – ao criar a tabela podem ser definidas larguras diferentes. – O scroll pane automaticamente coloca o cabeçalho com o nome das colunas no topo. table. //third column is bigger } else { column.getColumn(i).setPreferredWidth(100).2 16 . } } Programação Avançada em Java 2012-2013 PAJ03.tamanho • Juntar uma tabela a um JScrollPane: JScrollPane scrPane = new JScrollPane(table). i < 5. for (int i = 0.JTable . i++) { column = table.getColumnModel().setPreferredWidth(50). if (i == 2) { column. invocando setPreferredWidth para cada coluna – as colunas são guardadas num TableColumnModel – cada coluna é representada por um objeto do tipo TableColumn TableColumn column = null. void setResizable(boolean isResizable) – int getWidth(). que tem uma coleção de TableColumn • Cada TableColumn caracteriza uma coluna da JTable – TableCellEditor getCellEditor(). void setCellRenderer(TableCellRenderer cellRenderer) – TableCellRenderer getHeaderRenderer(). void setMinWidth(int minWidth) – int getModelIndex(). void setCellEditor(TableCellEditor cellEditor) – TableCellRenderer getCellRenderer(). void setMaxWidth(int maxWidth) – int getMinWidth().2 17 . void setPreferredWidth(int preferredWidth) – boolean getResizable(). void setHeaderValue(Object headerValue) – int getMaxWidth().TableColumn • Cada JTable tem um TableColumnModel. void setWidth(int width) – void sizeWidthToFit() Programação Avançada em Java 2012-2013 PAJ03. void setModelIndex(int modelIndex) – int getPreferredWidth(). void setHeaderRenderer(TableCellRenderer headerRenderer) – Object getHeaderValue().JTable . ..2 18 . Object data = model.TableModel • Todas as tabelas usam um TableModel para gerir os dados • Se nada for dito.. usam um DefaultTableModel • Eventos gerados por TableModel – alteração nos dados da tabela: informa os TableModelListener – têm que implementar o método void tableChanged(TableModelEvent e) public void tableChanged(TableModelEvent e) { int row = e. .// Do something with the data. int column = e. } Programação Avançada em Java 2012-2013 PAJ03.getColumn().getFirstRow(). TableModel model = (TableModel)e..getValueAt(row. column).getSource().getColumnName(column). String columnName = model. } public int getColumnCount() { return columnNames. int col) { rowData[row][col] = value. int col) { return true.length.toString(). } public Class getColumnClass(int c) { return getValueAt(0. int row.AbstractTableModel • Normalmente implementa-se o TableModel estendendo a classe AbstractTableModel – Exemplo simples: class MeuTableModel extends AbstractTableModel { public String getColumnName(int col) { return columnNames[col]. } public boolean isCellEditable(int row. fireTableCellUpdated(row. col). } } Programação Avançada em Java 2012-2013 PAJ03.2 19 . } public int getRowCount() { return rowData.getClass(). } public Object getValueAt(int row. } public void setValueAt(Object value. int col) { return rowData[row][col]. c).length. 2 20 . both data and structure Programação Avançada em Java 2012-2013 PAJ03. 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. o TableModel tem que lançar os eventos apropriados para informar os TableModelListener • O AbstractTableModel implementa métodos que suportam esta funcionalidade – Mais uma razão para estendermos a classe AbstractTableModel.Data Change Events • Quando os dados são alterados. Se o não fizer. o editor usa um JTextField alinhado à direita – O utilizador pode definir o cell renderer a usar em cada coluna.2 21 . mas usa um DateFormat para converter para String ImageIcon. Icon label alinhada ao centro Object label que mostra o valor retornado por toString Programação Avançada em Java 2012-2013 PAJ03. Float como Number.Editors e Renderers • Por razões de eficiência as células das tabelas não são componentes – Um mesmo cell renderer é normalmente usado para desenhar todas as células de um dado tipo – Um cell editor trata da edição do conteúdo – Exemplo: por defeito uma célula do tipo Integer é desenhada com uma JLabel. se o utilizador começar a editar a célula. mas usa um NumberFormat para converter para String Date label. é escolhido automaticamente um dependente do tipo de coluna: Boolean check box Number label alinhada à direita Double. comboBox. sportColumn. comboBox.addItem("Rowing"). comboBox.2 22 .addItem("Snowboarding").setCellEditor(new DefaultCellEditor(comboBox)).addItem("Speed reading"). JComboBox comboBox = new JComboBox().addItem("None").addItem("Teaching high school"). comboBox.getColumn(2). Programação Avançada em Java 2012-2013 PAJ03..getColumnModel()..JComboBox como cell editor • Pode ser usada uma combo box como editor da célula TableColumn sportColumn = table. comboBox. comboBox. .addItem("Chasing toddlers"). . frame. Programação Avançada em Java 2012-2013 PAJ03.. associando-a à frame: JMenuBar menuBar = new JMenuBar()..JMenuBar • Hierarquia de classes • Como criar uma barra de menu.2 23 .Menus .setJMenuBar(menuBar). Menus .2 24 .exemplo • Nos diapositivos seguintes vão ser apresentados fragmentos do código que cria o menu seguinte: Programação Avançada em Java 2012-2013 PAJ03. KeyEvent. menu. menuItem..setMnemonic(KeyEvent. cria um menu.gif")). JMenu menu. menuBar = new JMenuBar().VK_B). menuItem = new JMenuItem(new ImageIcon("images/middle.VK_A). //Create the menu bar.add(menuItem). menu = new JMenu("A Menu"). new ImageIcon("images/middle. menuItem. menu.setMnemonic(KeyEvent. menuBar. e associa o menu à menu bar JMenuBar menuBar.VK_D). //Build the first menu. submenu. e associa-os a um menu menuItem = new JMenuItem("A text-only menu item".add(menuItem).. Programação Avançada em Java 2012-2013 PAJ03.VK_T). – o exemplo seguinte cria menu items.gif")).2 25 .JMenu JMenuItem • À menu bar pode ser associado um menu – o exemplo cria uma menu bar. menu. menuItem = new JMenuItem("Both text and icon". menu.setMnemonic(KeyEvent. .add(menuItem).add(menu). • Um exemplo de inserção de um separador.2 26 .addSeparator().JRadioButtonMenuItem JCheckBoxMenuItem • Um exemplo de inserção de um separador.add(rbMenuItem). group.VK_C). menu. rbMenuItem = new JRadioButtonMenuItem("Another one").VK_R). group. e check boxes //a group of check box menu items menu.VK_H).add(rbMenuItem).add(cbMenuItem).VK_O).setMnemonic(KeyEvent. Programação Avançada em Java 2012-2013 PAJ03. menu. menu.setSelected(true). rbMenuItem.addSeparator().add(rbMenuItem).setMnemonic(KeyEvent.add(rbMenuItem). rbMenuItem = new JRadioButtonMenuItem("A radio button menu item"). cbMenuItem. cbMenuItem = new JCheckBoxMenuItem("Another one"). rbMenuItem.setMnemonic(KeyEvent. e radio buttons //a group of radio button menu items menu.add(cbMenuItem). cbMenuItem = new JCheckBoxMenuItem("A check box menu item"). ButtonGroup group = new ButtonGroup(). menu. cbMenuItem. rbMenuItem.setMnemonic(KeyEvent. add(menuItem).ALT_MASK)). submenu.2 27 .VK_S).getKeyStroke( KeyEvent. • Para receber eventos: implementam-se listeners correspondentes: – JMenuItem: ActionEvent – JRadioButtonMenuItem: ActionEvent ou ItemEvent – JCheckBoxMenuItems: ItemEvent Programação Avançada em Java 2012-2013 PAJ03. menu. submenu = new JMenu("A submenu"). ActionEvent.setAccelerator(KeyStroke. menuItem.add(menuItem). basta juntar um menu (o submenu) a outro //a submenu menu.addSeparator().VK_2. menuItem = new JMenuItem("An item in the submenu").Submenu Eventos • Para criar um submenu. submenu.add(submenu).setMnemonic(KeyEvent. submenu. menuItem = new JMenuItem("Another item"). getX(). output.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().2 28 . menuItem = new JMenuItem("A popup menu item"). menuItem. } private void maybeShowPopup(MouseEvent e) { if (e. – Registar um listener com os componentes associados ao popup menu //Add listener to components that can bring up popup menus.show(e. popup.getY()). – Mostrar o popup menu quando se clicar o botão do rato (como exemplo) class PopupListener extends MouseAdapter { public void mousePressed(MouseEvent e) { maybeShowPopup(e).isPopupTrigger()) { popup. e.add(menuItem).addActionListener(this).getComponent().addActionListener(this). MouseListener popupListener = new PopupListener(). popup.add(menuItem). menuItem = new JMenuItem("Another popup menu item"). e. menuItem. } } } Programação Avançada em Java 2012-2013 PAJ03.addMouseListener(popupListener). loweredetched = BorderFactory.createLineBorder(Color.createEtchedBorder(EtchedBorder. loweredbevel = BorderFactory. empty = BorderFactory.createEmptyBorder().createLoweredBevelBorder().Borders • Para criar borders.createRaisedBevelBorder().RAISED). recomenda-se usar a BorderFactory blackline = BorderFactory.2 29 .createTitledBorder( blackline.setBorder(raisedbevel). title = BorderFactory. raisedetched = BorderFactory. "title"). Programação Avançada em Java 2012-2013 PAJ03. raisedbevel = BorderFactory.LOWERED).black). … componente.createEtchedBorder(EtchedBorder. this.getBackground()).2 30 .setBackground(newColor). "Choose Background Color".JColorChooser • Para escolher uma cor de forma interativa • Exemplo usando um Dialog Color newColor = JColorChooser. if (newColor != null) { banner. } Programação Avançada em Java 2012-2013 PAJ03.showDialog( ColorChooserDemo2. banner. JFileChooser • Para selecionar um ficheiro – Cria-se um objeto FileChooser – Invoca-se o método showOpenDialog. int returnVal = fc.... Programação Avançada em Java 2012-2013 PAJ03. ..APPROVE_OPTION) { File file = fc.getSelectedFile(). … // processar o ficheiro.showOpenDialog(aComponent). que torna o diálogo visível – o método retorna quando o utilizador fecha o diálogo – testa-se se terminou validando ou não (Open ou Cancel) //Create a file chooser final JFileChooser fc = new JFileChooser(). } fc.2 31 .DIRECTORIES_ONLY). // componente pai if (returnVal == JFileChooser.setFileSelectionMode( JFileChooser. equals(Utils.tiff) || extension.2 32 . or png files.jpg) || extension. } } return false.equals(Utils.JFileChooser .jpeg) || extension. tiff. jpg. que obriga a implementar os métodos accept e getDescription • Exemplo que aceita apenas ficheiros com imagens: public class ImageFilter extends FileFilter { //Accept all directories and all gif. • O filtro tem que implementar o interface FileFilter.FileFilter • Para selecionar os ficheiros a mostrar. if (extension != null) { if (extension.equals(Utils.equals(Utils.equals(Utils.equals(Utils. } Programação Avançada em Java 2012-2013 PAJ03. } public String getDescription() { return "Just Images".gif) || extension.getExtension(f). public boolean accept(File f) { if (f.tif) || extension.png)) { return true. } String extension = Utils. } else { return false.isDirectory()) { return true. Gráficos • Vamos abordar alguns conceitos.2 33 . o que não dispensa a consulta à documentação da API. uma janela ou uma impressora • O user space é um sistema de coordenadas lógicas independente do dispositivo. tal como um monitor. Todas as geometrias passadas aos métodos Java são especificadas em termos de coordenadas neste espaço • A origem das coordenadas no user space é o canto superior esquerdo da área de desenho do componente Programação Avançada em Java 2012-2013 PAJ03. tutoriais ou outras fontes de informação • Espaços de coordenadas: – User space – O espaço no qual as primitivas gráficas são especificadas – Device space – O sistema de coordenadas do dispositivo. usando atributos de traço e cor (método draw) – Renderização de formas geométricas primitivas preenchendo o seu interior com a cor e padrão especificados (método fill) – Renderização de texto (método drawString). que são preenchidos com a cor e padrão especificados – Renderização de imagem (método drawImage) • A classe Graphics2D deriva da classe Graphics.awt.2 34 . o atributo font é usado para converter o texto em símbolos. que inclui a classe java. etc.Graphics2D.Rendering (renderização) • A API Java 2D. garante que o processo de renderização (composição da imagem) é a mesma para qualquer dispositivo (monitor. e é mais flexível e poderosa Programação Avançada em Java 2012-2013 PAJ03. impressora.). Inclui: – Renderização do contorno das formas geométricas primitivas. Double(10.draw(new Line2D.Float.y) – Line2D. 150)). 10. 100.2 35 . Point2D.Float. 120).Double g2. Point2D.y) – Point.Double – são dadas as coordenadas de cada extremo // draw Line2D. • Line2D – representa um segmento de reta no espaço de coordenadas (x.Double // Create Point Point p = new Point( 50. Programação Avançada em Java 2012-2013 PAJ03.Formas gráficas primitivas – Point. Line2D. Line • Point – representa uma localização no espaço de coordenadas (x. Float. y.Double( x.Double g2.Rectangle • Rectangle – – – – representa um retângulo no espaço de coordenadas (x.Formas gráficas primitivas . arcWidth. rectwidth.Double // draw RoundRectangle2D.y) Rectangle.Float. • RoundRectangle – representa um retângulo de cantos arredondados – RoundRectangle. arcHeight)).Double(x.draw(new Rectangle2D. rectheight)). RoundRectangle2D. rectheight. Programação Avançada em Java 2012-2013 PAJ03. y.Double draw: apenas o contorno fill: preenche a área // draw Rectangle2D. Rectangle2D. RoundRectangle2D.Double g2.draw(new RoundRectangle2D.2 36 . rectwidth. Rectangle2D. 2 37 . • Arc – Para desenhar parte de uma elipse.draw(new Arc2D. rectwidth. y. 90. Arc2D. Ellipse2D.Double g2.OPEN)). e define-se ainda um ângulo de início do arco. Arc • Ellipse – – – – representa uma elipse definida por um retângulo que a engloba Ellipse2D.Double(x. 135. Programação Avançada em Java 2012-2013 PAJ03. e a forma de fecho // draw Arc2D.Double(x. y. um arco de extensão.draw(new Ellipse2D.Double g2. rectwidth. A elipse é definida por um retângulo.rectheight.Double draw: desenha apenas o contorno fill: preenche a área // draw Ellipse2D.Float.Formas gráficas primitivas – Ellipse. rectheight)). setStroke(dashed).Renderização – exemplo 1 • Exemplo de desenho de um retângulo de cantos arredondados com traço interrompido – g2: contexto gráfico (graphics context) onde é feito o desenho – dashed: stroke.0f). Programação Avançada em Java 2012-2013 PAJ03.draw(new RoundRectangle2D. g2. 10.Double final static float dash1[] = {10.0f.0f.JOIN_MITER. y. dash1. ou seja.0f}. rectWidth.CAP_BUTT. final static BasicStroke dashed = new BasicStroke(1. g2. BasicStroke. 10. BasicStroke. 0.2 38 . 10)). o tipo de traço a usar no desenho – draw: método que faz o desenho com as condições especificadas // draw RoundRectangle2D.Double(x. rectHeight. 2 39 .Double redtowhite = new GradientPaint(0. 50)).fill (new Ellipse2D. 0.RED.color. g2. o método drw permitiria desenhar apenas o contorno da elipse.Double(0.WHITE). Programação Avançada em Java 2012-2013 PAJ03. sem pintar o interior // fill Ellipse2D.Renderização – exemplo 2 • Exemplo de desenho de uma elipse preenchida com um gradiente de cor – g2: contexto gráfico (graphics context) onde é feito o desenho – redtowhite: o gradiente a usar para preencher o espaço da elipse – fill: método que desenha a elipse e preenche o interior com a cor especificada.0.color. g2.setPaint(redtowhite).0. 100.100. • Fontes lógicas – Em Java: • Dialog • DialogInput • Monospaced • Serif • SansSerif Programação Avançada em Java 2012-2013 PAJ03. String[] fontFamilies = ge.2 40 . TrueType – Para conhecer as fontes instaladas: GraphicsEnvironment ge = GraphicsEnvironment..getAvailableFontFamilyNames().Fontes • Fontes físicas – Contêm a informação (símbolos e tabelas) que permitem converter sequências de caracteres em sequências de símbolos.ex.getLocalGraphicsEnvironment(). p. ex.setFont(new Font(fontChoice.ex.2 41 . styleChoice. Helvetica Bold Construtor: Font( String name.ex. int style. int size) • name: pode ser font family name ou font face name • constante de estilo para a fonte. bitmapped. ITALIC • size: tamanho em pontos • Definir a fonte a usar (válido para Graphics como para componentes de texto. Helvetica font face: p. sizeChoice)).) • Font – – – – – classe que representa uma fonte font family: p. normal. BOLD. como por exemplo JLabel ou JTextPane textTestPanel. Programação Avançada em Java 2012-2013 PAJ03. bold. italic font name: p. PLAIN.Escrita de texto (cont. Programação Avançada em Java 2012-2013 PAJ03.VALUE_TEXT_ANTIALIAS_ON). • Escrever texto: g2.getHeight(). hgt+2). // get the height of a line of text in this font and render context int hgt = metrics.KEY_TEXT_ANTIALIASING. // get the advance of my text in this font and render context int adv = metrics. • Anti-aliasing g2.stringWidth(text). como por exemplo a altura de uma linha de texto – A forma mais simples de medir texto é usar uma instância de FontMetrics // get metrics from the graphics FontMetrics metrics = graphics.setFont( fonteEscolhida).Escrita de texto • Métricas são medidas do texto renderizado por uma fonte.setRenderingHint( RenderingHints. int y).getFontMetrics(font).2 42 . int x.drawString(String s. RenderingHints. // calculate the size of a box to hold the text with some padding. g2. Dimension size = new Dimension(adv+2. cada pixel representa a cor da imagem na respetiva posição. } catch (IOException e) { } Programação Avançada em Java 2012-2013 PAJ03. width) e vertical (altura. try { img = ImageIO. height) da imagem quando desenhada • Principal classe a usar: java.read(new File("strawberry.jpg")). as dimensões representam a extensão horizontal (largura. Dado que BufferedImage é derivada de Image.Imagens . interpretar.image.awt.2 43 .BufferedImage – deriva de Image – A classe BufferedImage é fundamental no âmbito da API Java 2D. e obter informação.Image e BufferedImage • Na API Java 2D uma imagem é tipicamente um array bidimensional retangular de pixels. pode ser usada por todos os métodos de Graphics e Graphics2D que esperam um parâmetro do tipo Image. • Carregar uma imagem de disco BufferedImage img = null. Gere a imagem em memória e disponibiliza métodos para armazenar. srcy1. int dstx1. int dstx2. int srcx2. srcy2: área da imagem que vai ser desenhada boolean Graphics. dsty1. int srcx1. srcx2. dstx2. int x. int srcy2. int dsty1. int srcy1.desenhar • Desenhar uma imagem – observer pode ser null. dsty2: coordenadas da área onde a imagem vai ser desenhada – srcx1. ImageObserver observer).2 44 . Programação Avançada em Java 2012-2013 PAJ03. int y. ImageObserver observer). na maior parte dos casos boolean Graphics. int dsty2.Imagens .drawImage(Image img.drawImage(Image img. • Desenhar parte de uma imagem e/ou escalar a imagem – dstx1. .Imagens – criar em memória • Criar uma imagem (área de desenho) em memória – new BufferedImage(width. height) • GraphicsConfiguration. . BufferedImage. height. Graphics2D g2 = off_Image. – createGraphics retorna um objeto do tipo Graphics2D que podemos usar para desenhar na imagem off_Image • o gráfico pode depois ser apresentado ao utilizador por exemplo numa JLabel.createCompatibleImage(width.createImage(width. 50. e/ou impresso Programação Avançada em Java 2012-2013 PAJ03. – ou pedir a um objeto (p.ex. gravado.createCompatibleImage(width.2 45 .createGraphics(). height. TYPE_INT_RGB. type) • type: TYPE_INT_ARGB. componente) que crie uma imagem compatível • Component..TYPE_INT_ARGB). transparency) • Desenhar numa imagem em memória BufferedImage off_Image = new BufferedImage(100. height) • GraphicsConfiguration. } – Formatos disponíveis (pode haver mais plugins instalados) • JPEG. outputfile). } catch (IOException e) { .....2 46 . String formatName. GIF. WBMP Programação Avançada em Java 2012-2013 PAJ03.write(bi. ImageIO.Imagens . PNG.gravar • Gravar uma imagem – static boolean ImageIO.. "png". // é criada uma imagem em memória File outputfile = new File("saved.png"). BMP. File output) throws IOException • BufferedImage implementa o interface RenderedImage – Exemplo: try { // retrieve image BufferedImage bi = .write(RenderedImage im.
Copyright © 2024 DOKUMEN.SITE Inc.