ComboBox

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um ComboBox, que permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

ListBox

Em computação, uma caixa de listagem é um elemento de interface gráfica. Uma ListBox apresenta ao usuário um grupo de itens, exibidos em uma ou mais colunas. As listas podem ter muitos itens, por isso eles são muitas vezes colocados em painéis de rolagem.

OnShowWindow

É o evento que ocorre quando a o dialogo da aplicação é exibido.

Lbn_SelChange

É o evento que ocorre quando um estado de seleção é modificado.

Lbn_DblClk

É o evento que ocorre quando um duplo clique é efetuado no componente.

GetCurSel

Retorna o índice do item selecionado.

SetCurSel

Designa um item para ser selecionado.

Visual Studio

Para criar uma aplicação MFC siga os passos abaixo e use a imagem abaixo como referencia para o design do dialogo:

ComboList

  1. Crie um novo projeto de aplicação MFC C++ do tipo Dialog Based.
  2. Arraste no dialogo um GroupBox e modifique sua altura e largura para que caiba todos os componentes dentro dele, modifique sua propriedade Caption para: “ListBox e ComboBox”.
  3. Arraste um StaticText e mude sua propriedade Caption para: “Rolling Stones:”.
  4. Arraste um EditText e o posicione na frente do StaticText, mude suas propriedades  Border = False, Read Only = True e crie uma variável para ele chamada tmusica.
  5. Arraste um StaticText e mude seu Caption para: “ListBox –  Duplo clique nesta opção”.
  6. Arrate um ListBox e crie uma variável para ele chamada lista.
  7. Arraste um StaticText e mude seu Caption para: “Combobox – Escolha uma opção”.
  8. Arraste um ComboBox e crie uma variável para ele chamada combo.
  9. Crie um evento LBN_SELCHANGE para o componente combo e um outro LBN_DBLCLK para o componente lista.
  10. Complete seu código gerado automaticamente, com o código abaixo.

Exemplo:

Neste exemplo usamos um ComboBox e um ListBox para criar um programa C++ MFC e os eventos de cada um para interligar suas ações.

C++

// Código gerado automaticamente
// MFCApplication1Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "afxdialogex.h"
#include "Windowsx.h"
#include <string>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Dialog Data
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// CMFCApplication1Dlg dialog

CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CMFCApplication1Dlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lista);
	DDX_Control(pDX, IDC_COMBO1, combo);
	DDX_Control(pDX, IDC_EDIT2, tmusica);
}

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SHOWWINDOW()
	ON_CBN_SELCHANGE(IDC_COMBO1, &CMFCApplication1Dlg::OnCbnSelchangeCombo1)
	ON_LBN_DBLCLK(IDC_LIST1, &CMFCApplication1Dlg::OnLbnDblclkList1)
END_MESSAGE_MAP()

// CMFCApplication1Dlg message handlers

BOOL CMFCApplication1Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control

}

void CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMFCApplication1Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

// **************************
// * Desenvolvimento Aberto *
// **************************
//
// Nosso código começa Aqui

// Evento ocorre quando o dialogo é iniciado
void CMFCApplication1Dlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CDialogEx::OnShowWindow(bShow, nStatus);

	// Declara uma Array de itens
	CString itens[] = { L"Satisfaction", L"Paint it Black", L"Wild Horses", L"Brown Sugar",
		L"Sympathy for the Devil", L"Start Me Up" };

	// Adiciona os itens aos componentes
	for (int i = 0; i < 6; i++)
	{
		lista.AddString(itens[i]);
	}

	for (int i = 0; i < 6; i++)
	{
		combo.AddString(itens[i]);
	}

	// Indica qual item sera selecionado
	lista.SetCurSel(0);
	combo.SetCurSel(0);

}

// Evento ocorre na mudança de estado do item
void CMFCApplication1Dlg::OnCbnSelchangeCombo1()
{
	CString texto;
	combo.GetLBText(combo.GetCurSel(), texto);
	tmusica.SetWindowTextW(texto);
	lista.SetCurSel(combo.GetCurSel());
}

// Evento Ocorre no duplo clique do mouse
void CMFCApplication1Dlg::OnLbnDblclkList1()
{
	CString texto;
	lista.GetText(lista.GetCurSel(), texto);
	tmusica.SetWindowTextW(texto);
	combo.SetCurSel(lista.GetCurSel());
}

Combo Box

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um ComboBox, que permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

List Box

Em computação, uma caixa de listagem é um elemento de interface gráfica. Uma ListBox apresenta ao usuário um grupo de itens, exibidos em uma ou mais colunas. As listas podem ter muitos itens, por isso eles são muitas vezes colocados em painéis de rolagem.

Selected Index Changed

É um evento que ocorre quando um item é alterado.

Mouse Double Click

É um evento no qual é disparado quando o usuário efetua um duplo click no componente;

Exemplo:

Neste exemplo escrevemos um combobox e um listbox que interagem entre si por seus eventos. Lembre-se que não utilizamos em nosso curso o método Design First Code Later, escrevemos o programa usando código dinâmico. Após abrir o projeto no Visual Studio para abrir a unidade de código csharp clique no form,  na janela de propriedades, no botão de eventos e de um duplo clique na opção Shown.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Combobox
{
    public partial class Form1 : Form
    {
        // Declara os componentes
        Label titulo;
        Label tmusica;
        Label tcombo;
        Label tlista;
        ComboBox combo;
        ListBox lista;

        // Declara uma Array de itens
        string[] itens = {"Satisfaction" , "Paint it Black" , "Wild Horses", "Brown Sugar",
                          "Sympathy for the Devil", "Start Me Up"} ;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Adiciona propriedade ao formulario
            Form1.ActiveForm.Text = "Desenvolvimento Aberto - ComboList";

            // Cria componentes
            titulo = new Label();
            tmusica = new Label();
            tcombo = new Label();
            tlista = new Label();
            combo = new ComboBox();
            lista = new ListBox();

            // Adiciona propriedades ao componentes
            titulo.Text = "Rolling Stones : ";
            tmusica.Text = "Música";
            tcombo.Text = "Combobox - Escolha uma Opção";
            tlista.Text = "ListBox - Duplo click em uma Opção";

            combo.Items.AddRange(itens);
            lista.Items.AddRange(itens);

            combo.SelectedIndex = 0;
            lista.SelectedIndex = 0;

            titulo.Size = new Size (90, 20);
            tmusica.Size = new Size (200, 20);
            tcombo.Size = new Size (200, 20);
            combo.Size = new Size (160, 20);
            tlista.Size = new Size (200, 20);
            lista.Size = new Size (160, 90);

            // Posiciona componentes no formulario
            titulo.Location = new Point (5, 10);
            tmusica.Location = new Point (100, 10);
            tlista.Location = new Point(5, 50);
            lista.Location = new Point(5, 70);
            tcombo.Location = new Point(5, 170);
            combo.Location = new Point(5, 190);

            // Cria eventos
            lista.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lista_MouseDoubleClick);
            combo.SelectedIndexChanged += new System.EventHandler(this.combo_SelectedIndexChanged);

            // Adiciona componentes ao formulario
            Form1.ActiveForm.Controls.Add(titulo);
            Form1.ActiveForm.Controls.Add(tmusica);
            Form1.ActiveForm.Controls.Add(tlista);
            Form1.ActiveForm.Controls.Add(lista);
            Form1.ActiveForm.Controls.Add(tcombo);
            Form1.ActiveForm.Controls.Add(combo);

        }

        // Evento ocorre quando seleciona um item
        private void combo_SelectedIndexChanged(object sender, EventArgs e)
        {
            Object item = combo.SelectedItem;
            tmusica.Text = item.ToString();
            lista.SelectedIndex = combo.SelectedIndex;
        }

        // Evento ocorre quando um duplo click é efetuado
        private void lista_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Object item = lista.SelectedItem;
            tmusica.Text = item.ToString();
            combo.SelectedIndex = lista.SelectedIndex;
        }

    }
}

Combo Box

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um JComboBox, que permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

List Box

Em computação, uma caixa de listagem é um elemento de interface gráfica. Uma JList apresenta ao usuário um grupo de itens, exibidos em uma ou mais colunas. As listas podem ter muitos itens, por isso eles são muitas vezes colocados em painéis de rolagem.

MouseListener

A interface do ouvinte para receber eventos do mouse (pressionando , soltando, clique, entrada e saída) em um componente.

Mouse Adapter

É uma classe abstrata no qual o adaptador é usado para receber eventos de mouse. Os métodos dessa classe estão vazios. Esta classe existe como conveniência para a criação de objetos do ouvinte.

Mouse Clicked

É uma void da classe  Mouse Adapter chamada quando o botão do mouse foi clicado (pressionado e liberado) em um componente.

Exemplo:

Neste exemplo escrevemos um combobox e um listbox que interagem entre si por seus eventos.

Java

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;

public class ComboList extends JPanel implements ActionListener
{
	// Declara componentes
	JLabel titulo;
	JLabel tmusica;
	JLabel tcombo;
	JLabel tlista;
	JComboBox combo;
	JList lista;

	// Construtor da classe
	public ComboList()
	{

		// Declara uma array com o conteudo da lista
		String[] itens = { "Satisfaction" , "Paint it Black" , "Wild Horses", "Brown Sugar",
				           "Sympathy for the Devil", "Start Me Up"} ;

		// Cria componentes
		titulo =  new JLabel("Rolling Stones :");
		tmusica = new JLabel("Musica");
		tcombo = new JLabel("Combobox - Escolha uma Opção");
		tlista = new JLabel("ListBox - Duplo click em uma Opção");

		// Adiciona propriedades ao componentes
		combo = new JComboBox<>(itens);
		combo.setSelectedIndex(0);
		combo.addActionListener(this);

		lista = new JList<>(itens);
		lista.setSelectedIndex(0);

		// Cria um ouvinte do mouse para o componente
		lista.addMouseListener(new MouseAdapter()
		{
			// declara o evento para o click do mouse
			public void mouseClicked(MouseEvent e)
			{
				if (e.getClickCount() == 2)
				{
					int indice = lista.getSelectedIndex();
					combo.setSelectedIndex(indice);
				}
			}
		});

		// declara o layout da tela
		setLayout(new BoxLayout(this , BoxLayout.Y_AXIS));

		// adiciona componentes ao painel
		add(titulo);
		add(tmusica);
		add(Box.createRigidArea(new Dimension(0,10)));
		add(tlista);
		add(Box.createRigidArea(new Dimension(0,5)));
		add(lista);
		add(Box.createRigidArea(new Dimension(0,10)));
		add(tcombo);
		add(Box.createRigidArea(new Dimension(0,5)));
		add(combo);
		setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

	}

	// Evento do clique do combobox
	public void actionPerformed(ActionEvent e)
	{
		JComboBox escolha = (JComboBox)e.getSource();
		int indice = (int)escolha.getSelectedIndex();
		String texto = (String)escolha.getSelectedItem();
		lista.setSelectedIndex(indice);
		tmusica.setText( texto );
	}

	// Monta a interface grafica
	private static void mostraGui()
	{
		JFrame formulario = new JFrame("Lista de Música");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JComponent painel = new ComboList();
		painel.setOpaque(true);

		formulario.setContentPane(painel);
		formulario.pack();
		formulario.setVisible(true);
	}

	public static void main(String[] args)
	{
		//  inicializa a tela
		javax.swing.SwingUtilities.invokeLater(new  Runnable()
		{

			@Override
			public void run()
			{
				mostraGui();

			}
		});
	}
}

Unmanaged Dll

É uma dll criada com código C/C++ nativo ou seja é desenvolvida com código não gerenciado e será compilada em linguagem de máquina para executar diretamente no hardware.

DA_WifiPerfilEx.dll

É uma dll desenvolvida em C++ escrita em código nativo (unmanaged), gerando uma interface com a API Wifi do Windows onde é possível manipular o perfil de rede sem fio, sem precisar utilizar todos os requisitos necessários para isto, tais como elevação de direitos, contexto de usuário local, cripotografia e etc.

A dll possui seis funções Export em português Brasil para fácil entendimento, para saber mais sobre o funcionamento do código que manipula a API Wifi leia nosso post sobre como capturar senhas de rede sem fio nesta mesma categoria.

static  DAWIFIPERFILEX_API std::wstring Perfil();
static  DAWIFIPERFILEX_API std::wstring Ssid();
static  DAWIFIPERFILEX_API std::wstring Tipo();
static  DAWIFIPERFILEX_API std::wstring Seguranca();
static  DAWIFIPERFILEX_API std::wstring Senha();
static  DAWIFIPERFILEX_API bool Conectado();

Código Aberto

Disponibilizamos esta dll em uma solução Open Source desenvolvida no Microsoft Visual Studio, escrita em C++   e dividida em dois projetos o primeiro, o DA_APP é um projeto C++ MFC visual de onde efetuamos a chamada da dll e testamos seus retornos, o segundo é o wawifiperilex.dll e que gera a dll que controla e retorna todo o gerenciamento da API Wifi .

Uso

A Dll pode ser usada por outras linguagens de programação para chamar funções diretamente da API Wifi do Windows sem precisar se preocupar todos os complexos detalhes de como manipular código em um nível mais baixo. Na imagem abaixo temos o resultado da compilação em C++, mas você pode usar esta dll de qualquer linguagem que suporte código unmanaged.

dawifiperfilex-dll

Exemplo:

Este código é usado para chamar a dll nativa de uma linguagem baseada no Windows Framework, onde não é permitido o uso por referencia de uma dll que não seja criada para código CLR. No exemplo abaixo é possível chamar a senha wireless descriptografada diretamente do C#.

Visual Studio

Por Exemplo, no visual Studio para poder compilar código unmanaged é necessário alterar as propriedades do projeto. Na janela de propriedades do projeto, na opção Debug, Enable Debug, clique em: Enable Native Code Debugging.

C#

[DllImport("dawifiperfiex.dll", EntryPoint = "#4",
            CallingConvention = CallingConvention.Cdecl,
            CharSet = CharSet.Unicode)]

        [return: MarshalAs(UnmanagedType.LPTStr)]
        public static extern string Senha ();

Download

Desenvolvimento Aberto Tools : http://desenvolvimentoabertotools.wordpress.com/

Abrimos um novo espaço para as ferramentas e utilitários desenvolvidos pelo blog Desenvolvimento Aberto. Nossa ferramenta de estreia é um pequeno utilitário chamado DA_wireless.

DA_Wireless

Extrai o perfil da rede Wifi armazenado no seu computador exibindo todos dados inclusive a senha. Este programa é ideal para recuperar as senhas wireless armazenada em um computador.

Conheça o novo espaço de ferramentas Desenvolvimento Aberto: http://desenvolvimentoabertotools.wordpress.com/

Menu Painter

É uma ferramenta com a qual você cria interfaces de usuário para seus programas ABAP. Os programas ABAP contem uma grande variedade de funções, que se enquadram em diferentes categorias dentro da interface do usuário. É importante que os usuários sejam capazes de diferenciar entre essas categorias para escolher a função certa facilmente. No sistema R/3, você organiza as funções usando o Painter Menu.

Uma instância da interface do usuário, que consiste em uma barra de menu, uma barra de ferramentas padrão, uma barra de ferramentas do aplicativo, e uma configuração de tecla de função, é chamada de GUI Status. O  GUI Status e GUI Title definem como a interface do usuário irá parecer e se comportar em um programa ABAP.

O objeto principal de uma interface de usuário é o GUI Status. Isso pode ser atribuído a qualquer tela (tela, tela de seleção, ou lista). Tecnicamente, trata-se de uma referência a uma barra de menu, uma barra de ferramentas padrão, e uma configuração de teclas de função.

mpainter_menu_title

GUI Status / GUI Title

Para  criar um Status e Title do GUI, siga os passos abaixo:

  1. Entre na transação SE41
  2. Entre com o nome do programa ZDESIGNFIRST e clique em Create.
  3. Digite no campo STATUS, ZMENU.
  4. No campo Short Text digite, Meu primeiro menu e clique OK.
  5. Na tela Maintain Status, em Menu Bar, clique no primeiro icone com o sinal de mais.
  6. Após expandir, em Display Standard, preencha o primeiro campo com a palavra: Reservas.
  7. De um duplo clique no seu campo Reservas.
  8. Apos expandir, em Code digite: F_Mostrar e em Text digite Mostrar.
  9. Faça o mesmo procedimento acima adicionando os itens Limpar e Sair.
  10. Salve e ative o Menu.
  11. Digite /nse41 para voltar a tela inicial do  Menu Painter.
  12. Selecione o programa ZDESIGNFIRST, o Status ZMENU, clique no botão de radio Title List e clique no botão Create.
  13. Em Title Code digite o mesmo nome do programa e em Title digite: “Flight Model – Reservas de Voo.” e clique OK.
  14. Para testar ative e pressione F8, coloque o status = ZMENU, Screen = 100, Title = ZDESIGNFIRST e clique em OK.
  15. Entre na transação SE38 e modifique o programa ZDESIGNFIRST como mostra o código abaixo.

Exemplo:

Neste exemplo criamos um Menu Painter para um objeto de GUI Status e um Objeto GUI Title e o anexamos ao programa ZDESIGNFIRST que fizemos anteriormente no Screen Painter com o editor gráfico.

Abap

*&---------------------------------------------------------------------*
*& Report  ZDESIGNFIRST
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Screen Painter
*&---------------------------------------------------------------------*

REPORT  ZDESIGNFIRST.

TABLES SPFLI.

DATA  OK_CODE LIKE SY-UCOMM.

CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.

* Adiciona o Menu e Titulo criados no Menu Painter
SET PF-STATUS 'ZMENU'.
SET TITLEBAR 'ZDESIGNFIRST'.

  CASE SY-UCOMM.
    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

    WHEN 'F_MOSTRAR'.
      SELECT SINGLE *  FROM spfli INTO
             CORRESPONDING FIELDS OF spfli
      WHERE
             carrid = spfli-CARRID AND
             CONNID = spfli-CONNID.

    WHEN 'F_LIMPAR'.
      CLEAR SPFLI.

    WHEN 'F_GRAVAR'.
      INSERT INTO SPFLI VALUES SPFLI.
      MESSAGE 'Registro gravado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

    WHEN 'F_EXCLUIR'.
      DELETE FROM SPFLI CLIENT SPECIFIED
      WHERE
              mandt =  spfli-MANDT  AND
              carrid = spfli-CARRID AND
              CONNID = spfli-CONNID.
      MESSAGE 'Registro deletado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

  ENDCASE.
ENDMODULE.

Screen Painter Alphanumeric

O editor alfanumérico gráfico proporciona um ambiente amigável para projetar telas em todas as plataformas. Você pode iniciar o editor alfanumérico a partir da tela inicial do Screen Painter ou a partir do Navegador do repositório.

O editor alfanumérico contém as mesmas funções que o  editor gráfico. A diferença entre os dois está na maneira de criar elementos gráficos e como eles são exibidos na tela.

O sistema utiliza caracteres alfanuméricos para exibir elementos gráficos. O sistema distingue todos os elementos gráficos com cor.  Para garantir que você não possa substituir um, todos eles são protegidos contra gravação. Para alterar um elemento, você deve selecioná-lo e, em seguida, escolher uma função apropriada. Ao contrário do editor gráfico, você não pode escolher os elementos da paleta  de elemento. Em vez disso, você usa os menus.

spainter_alpha

 Aphanumeric Editor

Para criar uma tela no editor alfanumérico siga os seguintes passos:

  1. Crie um programa chamado ZDF_Alpha.
  2. Entre na transação SE51.
  3. Crie uma Screen Painter para seu programa com o Screen Number 100.
  4. Na aba Flow Logic, tire o comentario da linha: MODULE STATUS_0100.
  5. Dê um duplo clique na variavel STATUS_0100 e crie um PBO Module, selecionando o programa MAIN e salve o ZDF_Alpha.
  6. Volte para a transação SE51 e abra para modificação o seu Screen Painter ZDF_Alpha.
  7. Clique no menu Utilities e em Settings.
  8. Na aba Screen Painter, desmarque o Graphical Layout Editor e clique OK.
  9. Clique em Layout para abrir o editor gráfico alfanumérico.
  10. No Editor alfanumérico você pode usar os menus para criar componentes.
  11. Posicione o cursos na primeira linha, clique no menu Edit, Create Element, Text Field e preencha a propriedade Text para: Reserva de Voo e clique em Transfer.
  12. Posicione o cursor duas linha abaixo.
  13. No menu Goto, Dictionary/Program Fields ou CTRL + F6.
  14. Em Table/Field Name coloque SPFLI e clique em Get from Dict.
  15. Selecione todos os campos e clique em Transfer.
  16. No menu Edit clique em Select Block.
  17. Clique no menu Edit, Create Element, Pushbutton e crie um botão chamado Mostrar com a propriedade Fct_CODE = F_MOSTRAR.
  18. Crie mais 4 botões com o mesmo procedimento acima para SAIR, LIMPAR, GRAVAR e EXCLUIR.
  19. Na aba Element List va para o elemento Tipo OK e o nomeie para OK_CODE.
  20. Salve sua tela e clique em Activate.
  21. volte para o progama ZDF_Alpha e escreva o codigo abaixo.

Para usar este programa, caso você não tenha usado o post anterior  você precisa rodar o programa ZDADOS para preencher as tabelas auxiliares para o Flight Model. Você obterá uma tela igual a figura abaixo:

spainter_alpha_programa

Exemplo:

Neste programa usamos a tabela de reserva de  voo, SPFLI do Flight Model que não possui uma GUI de entrada de dados. O que vamos fazer é criar a GUI de entrada de dados apenas para esta tabela usando o Screen Painter e OPEN SQL, visto que temos que respeitar as Foreing Keys das tabelas transparentes,  é necessário rodar primeiramente o programa ZDADOS para preencher manualmente as tabelas auxiliares para nosso programa.

Abap

*&---------------------------------------------------------------------*
*& Report  ZDF_ALPHA
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Screen Painter - Alphanumeric
*&---------------------------------------------------------------------*

REPORT  ZDF_ALPHA.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*

TABLES SPFLI.

DATA OK_CODE LIKE SY-UCOMM.
DATA PROG LIKE SY-REPID.
PROG = 'ZDF_ALPHA'.

CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.

 SET TITLEBAR 'Screen Painter Alpha - Reserva de Voo' OF PROGRAM PROG.

  CASE SY-UCOMM.
    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

    WHEN 'F_MOSTRAR'.
      SELECT SINGLE *  FROM spfli INTO
             CORRESPONDING FIELDS OF spfli
      WHERE
             carrid = spfli-CARRID AND
             CONNID = spfli-CONNID.

    WHEN 'F_LIMPAR'.
      CLEAR SPFLI.

    WHEN 'F_GRAVAR'.
      INSERT INTO SPFLI VALUES SPFLI.
      MESSAGE 'Registro gravado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

    WHEN 'F_EXCLUIR'.
      DELETE FROM SPFLI CLIENT SPECIFIED
      WHERE
              mandt =  spfli-MANDT  AND
              carrid = spfli-CARRID AND
              CONNID = spfli-CONNID.
      MESSAGE 'Registro deletado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

  ENDCASE.

ENDMODULE.                 " STATUS_0100  OUTPUT

Screen Painter

É uma ferramenta do ABAP Workbench que permite a criação de telas para suas transações. Você pode usá-lo tanto para criar a própria tela, com campos e outros elementos gráficos, e para escrever a lógica do fluxo atrás da tela.

O Screen Painter tem um editor de layout que você usa para criar seu layout de tela. Ele funciona no modo gráfico e  no modo alfanumérico.  Ambos os modos oferecem as mesmas funções, mas usam diferentes interfaces. No modo gráfico, você usa uma interface de arrastar semelhante a uma ferramenta de desenho. No modo alfanumérico, você usa seu teclado e menus.

Design First, Code Later

O editor de layout gráfico fornece um ambiente amigável para projetar telas. Você pode iniciar o editor de layout a partir da tela inicial do Screen Painter ou a partir do Navegador do repositório. O editor de layout possui dependências com o SAP GUI e você precisa estar usando versões compatíveis com o Graphical Layout Editor.

Depois de adicionar um elemento na sua tela, você pode convertê-lo para um outro tipo de elemento usando o menu Editar. Você também pode usar a paleta de elementos para selecionar e colocar os elementos da tela sem primeiro identificar seus campos ou você pode importar os campos e criar componentes automaticamente direto de uma tabela transparente.

Screen Painter Layout Editor

  1. Entre na transação SE38 e crie um programa chamado ZDesignFirst.
  2. Entre na transação SE51
  3. Adicione no campo Program, o nome do programa criado anteriormente e no campo Screen Number escreva o numero: 100 e clique em Create.
  4. No campo Short Description coloque : Desenvolvimento Aberto.
  5. Na aba Flow Logic, apague o caractere de comentario “*”, deixando a linha: “MODULE STATUS_0100.” compilavel.
  6. De um duplo clique na variável “STATUS_0100“.
  7. Em Create PBO Module escolha: MAIN PROGRAM, clique em Ok e salve.spainter_pbo
  8. Digite a transação /nSE51, para voltar no Screen Painter, selecione modificar e clique em Layout.spainter_layout
  9. No editor de Layout clique no icone Dictionary ou aperte a tecla F6.
  10. Na tela seguinte, no campo Table/Field Name escolha a tabela SPFLI e clique no botão GET FROM DICTIONARY.spainter_dict
  11. Selecione todos os campos, clique em OK e solte os componentes na tela (não converta nenhum componente).
  12. Coloque um componente BOX na tela e de um duplo clique, na janela de propriedades, mude a  propriedade Text para: Reserva de Voo.
  13. Coloque um PushButton na tela e preencha as propriedades: Name = Mostrar, Text = Mostrar e FctCode = F_MOSTRAR.
  14. Crie mais quatro botões e repita os mesmos procedimentos acima, o primeiro com o nome de limpar e segundo com o nome de Sair, Gravar e Excluir.
  15. Alinhe o Desing da tela como na figura abaixo.spainter_design
  16. Clique em Save, Activate e pressione Flow Logic.
  17. Na aba Element List, no elemento tipo OK nomeie para OK_CODE.spainter_okcode
  18. Na aba Attributes em Cursor Position escolha: SPFLI_CARRID
  19. Clique em Activate e volte para a transação SE38  e abra o seu programa ZDesignFirst.
  20. Use os dois códigos abaixo.

Programa Abap

O programa com a tela totalmente funcional, deve ficar como na imagem abaixo, deve ser capaz de pesquisar, gravar e excluir uma tabela transparente:

spainter_programa

Exemplo:

Neste programa usamos a tabela de reserva de  voo, SPFLI do Flight Model que não possui uma GUI de entrada de dados. O que vamos fazer é criar a GUI de entrada de dados apenas para esta tabela usando o Screen Painter e OPEN SQL, visto que temos que respeitar as Foreing Keys das tabelas transparentes,  é necessário rodar primeiramente o programa Zdados para preencher manualmente as tabelas auxiliares para nosso programa. Vale ressaltar que neste ponto só nos interessa o Screen Painter e não como manipular dados consistentemente, o que veremos mais tarde.

Abap

Zdados -Rode este programa para gravar dados nas tabelas transparentes.

*&---------------------------------------------------------------------*
*& Report  ZDADOS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Insere Dados manualmente no Flight Model
*&---------------------------------------------------------------------*

REPORT  ZDADOS.

* Define tabelas do Banco de dados
TABLES SCARR.
TABLES SGEOCITY.
TABLES SAIRPORT.
TABLES SPFLI.

* Apaga dados existentes
DELETE FROM SCARR.
DELETE FROM SGEOCITY.
DELETE FROM SAIRPORT.
DELETE FROM SPFLI.

* Cria MATRIZs de dados (rows)
DATA MATRIZ1 TYPE SCARR.
DATA MATRIZ2 TYPE SGEOCITY.
DATA MATRIZ3 TYPE SAIRPORT.
DATA MATRIZ4 TYPE SPFLI.

* Insere dados.

MATRIZ1-CARRID = '001'.
MATRIZ1-CARRNAME = 'DA LINNHAS AEREAS'.
MATRIZ1-CURRCODE = 'REAL'.
MATRIZ1-MANDT = '001'.
MATRIZ1-URL  = 'https://desenvolvimentoaberto.wordpress.com'.

INSERT INTO SCARR VALUES MATRIZ1.

MATRIZ2-CITY = 'SAO PAULO'.
MATRIZ2-COUNTRY = 'BRA'.
MATRIZ2-LATITUDE = '23'.
MATRIZ2-LONGITUDE = '46'.
MATRIZ2-MANDT = '001'.

INSERT INTO SGEOCITY VALUES MATRIZ2.

MATRIZ2-CITY = 'RIO DE JANEIRO'.
MATRIZ2-COUNTRY = 'BRA'.
MATRIZ2-LATITUDE = '22'.
MATRIZ2-LONGITUDE = '43'.
MATRIZ2-MANDT = '001'.

INSERT INTO SGEOCITY VALUES MATRIZ2.

MATRIZ3-ID ='001'.
MATRIZ3-MANDT ='001'.
MATRIZ3-NAME = 'AEROPORTO DE CONGONHAS'.
MATRIZ3-TIME_ZONE = 'GMT-3'.

INSERT INTO SAIRPORT VALUES MATRIZ3.

MATRIZ3-ID ='002'.
MATRIZ3-MANDT ='001'.
MATRIZ3-NAME = 'AERO PORTO SANTOS DUMONT'.
MATRIZ3-TIME_ZONE = 'GMT-3'.

INSERT INTO SAIRPORT VALUES MATRIZ3.

MATRIZ4-AIRPFROM = '001'.
MATRIZ4-AIRPTO = '002'.
MATRIZ4-ARRTIME = '170000'.
MATRIZ4-CARRID = '001'.
MATRIZ4-CITYFROM = 'SAO PAULO'.
MATRIZ4-CITYTO = 'RIO DE JANEIRO'.
MATRIZ4-CONNID = '001'.
MATRIZ4-COUNTRYFR = 'BRA'.
MATRIZ4-COUNTRYTO = 'BRA'.
MATRIZ4-DEPTIME = '181500'.
MATRIZ4-DISTANCE = '500'.
MATRIZ4-DISTID = 'KM'.
MATRIZ4-FLTIME = '75'.
MATRIZ4-FLTYPE = 'X'.
MATRIZ4-MANDT = '001'.
MATRIZ4-PERIOD = '1'.

INSERT INTO SPFLI VALUES MATRIZ4.

* Exibe imagem
WRITE : / 'Dados inseridos'.

ZDesignFirst – Screen Painter

*&---------------------------------------------------------------------*
*& Report  ZDESIGNFIRST
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Screen Painter
*&---------------------------------------------------------------------*

REPORT  ZDESIGNFIRST.

* Define tabela de Reserva de Voo
TABLES SPFLI.

* Define variaveis do programa
DATA : OK_CODE    LIKE   SY-UCOMM.

* chama tela numero 100
CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.

* verifica ação dos botões
  CASE SY-UCOMM.
    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

    WHEN 'F_MOSTRAR'.
      SELECT SINGLE *  FROM spfli INTO
             CORRESPONDING FIELDS OF spfli
      WHERE
             carrid = spfli-CARRID AND
             CONNID = spfli-CONNID.

    WHEN 'F_LIMPAR'.
      CLEAR SPFLI.

    WHEN 'F_GRAVAR'.
      INSERT INTO SPFLI VALUES SPFLI.
      MESSAGE 'Registro gravado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

    WHEN 'F_EXCLUIR'.
      DELETE FROM SPFLI CLIENT SPECIFIED
      WHERE
              mandt =  spfli-MANDT  AND
              carrid = spfli-CARRID AND
              CONNID = spfli-CONNID.
      MESSAGE 'Registro deletado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

  ENDCASE.
ENDMODULE.

Function Modules 

Módulos de função são rotinas ABAP que são armazenados em uma biblioteca de função central. Elas não são específicas do aplicativo, mas disponível em todo o sistema. O ABAP Workbench vem com um grande número de módulos de função padrão.

Como rotinas de formulários, módulos de função podem encapsular o código do programa e fornecer uma interface para troca de dados. Os Módulos de função devem pertencer a um grupo chamado de um grupo de funções.

Eles possuem uma interface fixa para troca de dados. Isso torna mais fácil para você passar parâmetros de entrada e saída para o módulo de função. Por exemplo, você pode atribuir valores padrão para os parâmetros de entrada. A interface também suporta manipulação de exceção. Isto permite-lhe detectar erros e passá-los de volta para o programa de chamada para o manuseio.

Os módulos usam a sua própria área de memória. O programa de chamada e do módulo de função não pode trocar dados usando uma área de memória compartilhada – devem usar a interface do módulo de função. Isso evita efeitos colaterais desagradáveis, como a substituição de dados acidentalmente. Você chama um módulo de função pelo seu nome (que deve ser único) em um comunicado de função de chamada usando a palavra chave CALL FUNCTION.

Function Builder

O Function Builder permite desenvolver, testar e documentar novos módulos de função. Você também pode usá-lo para exibir informações sobre os módulos de função existentes.

Criando uma Função

  1.  Entre na transação SE37.
  2.  No menu Goto, Function Groups, Create Group, crie um novo Grupo de função chamado ZDEVA.fbuilder_group
  3.  Digite a transação SE80, no ABAP WorkBench escolha grupo de função e o seu grupo, clique com o botão direito em cima do nome do seu grupo e escolha Activate.fbuilder_group_active
  4. Volte para a transação SE37.
  5. Em Function Module, escreva ZF_FUNCAO_DA e clique em Create.
  6. fbuilder_function
  7. Na aba Import, nos campos respectivos digite: Parameter name = TEXTO1, Typing = TYPE, Associated Type = String.
  8. No segundo registro digite: Parameter name = TEXTO2, Typing = TYPE, Associated Type = String.
  9. Na Aba Export, nos campos respectivos digite: Parameter name = RESULTADO, Typing = TYPE, Associated Type = String.
  10. Na Aba Exceptions nos campos respectivos digite: Exception = DA_ERRO, ShortText = Erro na função Dev Aberto.
  11. Na aba Source Code, você pode ver o código gerado automaticamente, preencha de acordo com a imagem abaixo.fbuilder_sourcecode
  12. Clique em Activate para ativar a função.

 Call Function

Para chamar um módulo de função, use a instrução de função de chamada  CALL FUNCTION.

Exemplo:

Neste exemplo criamos um modulo de função no Function Builder e usamos um programa para chamar esta função.

Abap

Função

FUNCTION ZF_FUNCAO_DA.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(TEXTO1) TYPE  STRING
*"     REFERENCE(TEXTO2) TYPE  STRING
*"  EXPORTING
*"     REFERENCE(RESULTADO) TYPE  STRING
*"  EXCEPTIONS
*"      DA_ERRO
*"----------------------------------------------------------------------

IF TEXTO1 NE 'ERRO'.

  CONCATENATE TEXTO1 TEXTO2 INTO RESULTADO SEPARATED BY ' '.

ELSE.

  RAISE DA_ERRO.

ENDIF.

ENDFUNCTION.

Programa

*&---------------------------------------------------------------------*
*& Report  ZFUNCAO
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Modulo de Função
*&---------------------------------------------------------------------*

REPORT  ZFUNCAO.

DATA R_FUNCAO TYPE STRING.

* Chama função

CALL FUNCTION 'ZF_FUNCAO_DA'
  exporting
    TEXTO1    = 'Desenvolvimento'
    TEXTO2    = 'Aberto'
  importing
    RESULTADO = R_FUNCAO.

WRITE : / 'Retorno da função:', R_FUNCAO.

Diferentemente do Eclipse (IBM),  o NetBeans possui uma IDE gráfica que em seus primórdios foi baseada na IDE do Delphi (Borland), para quem conhece Delphi já sabe que a sua interface de GUI RAD foi um dos seus pontos fortes. O NetBeans adotado pela Sun e agora pela Oracle, possui uma magnifica e produtiva IDE para Java.

Há até uma certa disputa entre as duas IDEs e a preferencia dos desenvolvedores, se por um lado o Eclipse lhe proporciona um código mais limpo e mais leve, o NetBeans sem duvida lhe dará mais produtividade. Você precisa entender que o NetBeans assim o Eclipse não são apenas uma IDE e sim uma plataforma, apesar de serem famosos por proporcionarem uma IDE Java, cada um possui um proposito diferente.

O Eclipse é uma plataforma baseada em plug-ins que permite expansão infinita de suas funcionalidades, permitindo que à partir da plataforma Eclipse outros softwares sejam criados, como por exemplo o IBM Data Studio. O NetBeans é uma plataforma dedicada a desenvolvimento de softwares desktop proporcionando técnicas de desenvolvimento modulares prometendo reduzir o tempo de desenvolvimento de aplicações gráficas em até um ano a menos que outras plataformas.

Disputas a parte, você que esta começando pode escolher por conta própria a sua interface preferida e decidimos lhe ajudar a escolher a melhor forma para criar seus programas em Java.

Para baixar o NetBeans você pode ir diretamente no site da Oracle ou : https://netbeans.org/downloads/index.html

Desenvolvemos o mesmo programa baseado na diferença de escrita de código para as duas IDEs Java. Para ver o mesmo programa desenvolvido para a IDE Eclipse use o link abaixo:

IDE Eclipse: https://desenvolvimentoaberto.wordpress.com/2014/03/12/visual-controles-radiobutton-events-getstatechange-java/

Design First, Code Later em Java  Free Design
No Construtor de GUIs da IDE, você pode construir seus formulários simplesmente colocando os componentes onde quiser, como se você estivesse usando o posicionamento absoluto. O GUI Builder descobre quais são atributos de layout  necessários e, em seguida, gera o código para você automaticamente. Você não precisa se ​​preocupar com inserções, âncoras, preenchimentos, e assim por diante .

Para referencia de como deve ficar o seu projeto e o design de seu programa utilize a imagem abaixo:

IDE_NetBeans

NetBeans

  1. Crie um novo Projeto Java Application chamado JDevAberto e clique em Next.
  2. Deixe marcado o checkbox Criar Classe Principal, mas apague o conteúdo do campo de edição, o deixando em branco, em seguida clique em Finalizar.
  3. Já na IDE com o projeto aberto, clique com o botão direito no projeto escolha novo JFrame e o nomeie para JDevAberto_Main
  4. Na janela de propriedades do JFrame clique em Title coloque: “Desenvolvimento Aberto”.
  5. Coloque um JPanel e modifique sua largura e altura até atingir metade do JFrame.
  6. Com o JPanel selecionado, clique em Border na janela de propriedades.
  7. Em Borda com Titulo, coloque o titulo: “Escolha uma opção ou pressione Alt A, B, C ou D” e clique em OK.
  8. Arraste quatro Botões de Radio e em sua respectiva propriedade Text, nomei cada um dos elementos como: Somar, Subtrair, Multiplicar, Dividir.
  9. Na propriedade Mnemonic de cada botão coloque respectivamente as letras : A, B, C e D.
  10. Coloque um Grupo de Botões no JPanel, ele ficara invisivel no formulario.
  11. Clique em cada RadioButton e na propriedade buttonGroup escolha o grupo de botões.
  12. Coloque dois JLabel na tela e dois Campos de textos.
  13. Coloque o valor 0 na propriedade Text dos campos e nomeie a propriedade Texts dos Labels para : Numero
  14. Coloque um botão na tela, mude sua propriedade Text para “OK” e o alinhe ao lado dos labels e campos de texto.
  15. Coloque uma Area de Texto e modifique sua largura e altura para que complete a parte inferior da tela.
  16. No modo Design, na barra de ferramentas ao lado da paleta Histórico, clique no botão Visualizar Design para ver as funcionalidades da sua GUI.
  17. Clique no botão Run na barra de ferramentas para rodar sua aplicação.

Finalização

Neste ponto sua aplicação já possui o design mas ainda nenhuma funcionalidade, precisamos programar os eventos de cada botão, para isso de um duplo clique em cada RadioButton e um duplo clique no botão.

O NetBeans criou para você os eventos automaticamente, agora só precisamos olhar o código abaixo e completar os eventos em nosso programa, após a finalização seu programa deve funcionar como na imagem abaixo:

pCalc

Exemplo:

Este é o código criado automaticamente acrescentado do código dentro dos eventos para a funcionalidade do programa, para visualizar os  eventos de um modo mais fácil, procure o bloco de código  que está marcado com o comentário:  “//************** DA”.

Java

// *
// * To change this license header, choose License Headers in Project Properties.
// * To change this template file, choose Tools | Templates
// * and open the template in the editor.
// */

// **
// *
// * @author Desenvolvimento Aberto
// */
public class JDevAberto_Main extends javax.swing.JFrame {

   //**
   //* Creates new form JDevAberto_Main
   //*/
    public JDevAberto_Main() {
        initComponents();
    }

    //**
    // * This method is called from within the constructor to initialize the form.
    // * WARNING: Do NOT modify this code. The content of this method is always
    // * regenerated by the Form Editor.
    // */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        jPanel1 = new javax.swing.JPanel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();
        jRadioButton4 = new javax.swing.JRadioButton();
        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Desenvolvimento Aberto");

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Escolha uma opção ou pressione Alt A, B, C ou D"));

        buttonGroup1.add(jRadioButton1);
        jRadioButton1.setMnemonic('A');
        jRadioButton1.setText("Somar");
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton1ActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButton2);
        jRadioButton2.setMnemonic('B');
        jRadioButton2.setText("Subtrair");
        jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton2ActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButton3);
        jRadioButton3.setMnemonic('C');
        jRadioButton3.setText("Multiplicar");
        jRadioButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton3ActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButton4);
        jRadioButton4.setMnemonic('D');
        jRadioButton4.setText("Dividir");
        jRadioButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton4ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(15, 15, 15)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jRadioButton1)
                    .addComponent(jRadioButton2)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(jRadioButton3)
                        .addComponent(jRadioButton4, javax.swing.GroupLayout.Alignment.LEADING)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jRadioButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jRadioButton2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jRadioButton3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jRadioButton4))
        );

        jLabel1.setText("Numero:");

        jTextField1.setText("0");

        jTextField2.setText("0");

        jLabel2.setText("Numero:");

        jButton1.setText("OK");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE))
                    .addComponent(jScrollPane1))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

//************** DA
// Preencha os Eventos a seguir:

    private void jRadioButton4ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        jTextArea1.append("Dividir:\n");
    }

    private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        jTextArea1.append("Somar:\n");
    }

    private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        jTextArea1.append("Subtrair:\n");
    }

    private void jRadioButton3ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        jTextArea1.append("Multiplicar:\n");
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:

        double total;

        if (jRadioButton1.getSelectedObjects() != null)
        {
            total = Double.parseDouble(jTextField1.getText()) +
                    Double.parseDouble(jTextField2.getText());

            jTextArea1.append(jTextField1.getText()  + " + " + jTextField2.getText() +
                              " = " + String.valueOf(total)+ "\n");

        }

        if (jRadioButton2.getSelectedObjects() != null)
        {
            total = Double.parseDouble(jTextField1.getText()) -
                    Double.parseDouble(jTextField2.getText());

            jTextArea1.append(jTextField1.getText()  + " - " + jTextField2.getText() +
                              " = " + String.valueOf(total)+ "\n");

        }

        if (jRadioButton3.getSelectedObjects() != null)
        {
            total = Double.parseDouble(jTextField1.getText()) *
                    Double.parseDouble(jTextField2.getText());

            jTextArea1.append(jTextField1.getText()  + " * " + jTextField2.getText() +
                              " = " + String.valueOf(total) + "\n");

        }

        if (jRadioButton4.getSelectedObjects() != null)
        {
            total = Double.parseDouble(jTextField1.getText()) /
                    Double.parseDouble(jTextField2.getText());

            jTextArea1.append(jTextField1.getText()  + " / " + jTextField2.getText() +
                              " = " + String.valueOf(total) + "\n");

        }
    }

 //************** DA
// Fim dos Eventos

    //**
    //* @param args the command line arguments
    //*/
    public static void main(String args[]) {
        //* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        //* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
        //* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
        //*/
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(JDevAberto_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JDevAberto_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JDevAberto_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JDevAberto_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JDevAberto_Main().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JRadioButton jRadioButton4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    // End of variables declaration
}