Wednesday, December 26, 2012

Configurando JDK e JavaFX Web Plugin no Linux

Installar e configurar o Java Development Kit no Linux é simples e requer alguns procedimentos.
Neste post instalamos o JDK 7 update 7 no sistema operacional Linux Mint 64bit release 13 (Maya), o qual é baseado na distribuição Linux Ubuntu.

Acesse http://www.oracle.com/technetwork/java/javase/downloads/index.html, após ler e aceitar o contrato de licensa :) efetue o download do seguinte arquivo:  jdk-7u07-linux-x64.tar.gz (o trecho u07 no nome do arquivo representa a última atualização. Você pode baixar uma versão mais recente).

Extraia o conteúdo do arquivo:
tar -zxf  jdk-7u07-linux-x64.tar.gz
No meu caso movi a pasta extraída, jdk1.7.0_07, para /usr/lib/jvm:
sudo mv jdk1.7.0_07  /usr/lib/jvm
Agora execute os seguintes comandos:
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0 07" 1
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_07/bin/javac" 1
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_07/bin/javaws" 1
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_07/jre/bin/java" 1
sudo update-alternatives --config java
Após executar o último comando, o console vai exibir uma saída similar a seguinte:
There are 6 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                    Priority   Status
------------------------------------------------------------

  0            /usr/bin/gij-4.6                         1046      auto mode
  1            /usr/bin/gij-4.6                         1046      manual mode
  2            /usr/lib/jvm/jdk1.7.0_07                 1         manual mode
  3            /usr/lib/jvm/jdk1.7.0_07/bin/javac       1         manual mode
  4            /usr/lib/jvm/jdk1.7.0_07/bin/javaws      1         manual mode
* 5            /usr/lib/jvm/jdk1.7.0_07/jre/bin/java    1         manual mode
  6            /usr/lib/jvm/jdk1.7.0_07_i586/bin/java   1         manual mode


Press enter to keep the current choice[*], or type selection number:
Escolha o número que represente a opção jdk1.7.0_07/jre/bin/java, 5 no exemplo acima.

Agora verifique sua versão do Java executando o comando:
java -version
o console deve imprimir a seguinte saída:
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

Configurando o Web Plugin para aplicações Java e JavaFX

Para habilitar a execução de aplicações Java e JavaFX nos browsers Mozilla Firefox e Google Chrome, é necessário criar um link para o arquivo libnpjp2.so dentro da pasta plugins no diretório de instalação dos browsers.
Execute os seguintes comandos (lembrando que o meu JDK está em /usr/lib/jvm)
cd /opt/google/chrome/plugins
sudo ln -s /usr/lib/jvm/jdk1.7.0_07/jre/lib/amd64/libnpjp2.so
cd /usr/lib/mozilla/plugins
sudo ln -s /usr/lib/jvm/jdk1.7.0_07/jre/lib/amd64/libnpjp2.so

Acesse o showcase do JavaFX, se a página executar normalmente, sua máquina já está habilitada a executar qualquer aplicção Java, tanto desktop quanto web.

Showcase do JavaFX, novo padrão para componentes visuais avançados Java


Wednesday, November 7, 2012

Conectando sua aplicação Java a um Scanner


Scanners, câmeras digitais, e outros dispositivos de aquisição de imagens estão constantemente presentes no panorama da computação. Em que pese essa ubiquidade, Java ainda não possui uma especificação ou uma API padrão para interagir com estes componentes.

Quando se faz necessário integrar uma aplicação Java a tais dispositivos, o programador deve recorrer a bindings, que usam métodos nativos fora da JVM.

Atualmente existem dois protocolos, conhecidos como TWAIN e SANE, que especificam a comunicação entre um software e um dispositivo de imagens.

TWAIN, além de um protocolo, também representa uma organização formada pelas principais marcas da indústria da imagem. SANE (Scanner Access Now Easy), comumente usade em Linux, é uma API que padroniza o acesso a dispositivos de imagens, e difere de TWAIN a medida em que separa claramente o frontend (programa do usuário) e o backend (driver), o que torna mais fácil e transparente o acesso aos dispositivos dentro de uma rede (como uma LAN cheia de máquinas, mas com scanners conectados a apenas um ou duas máquinas, por exemplo).

Segue uma implementação simples que exibe uma janela e um botão que ativa o scanner local para digitalizar o documento contido bandeja. E necessário configurar seu classpath com as bibliotecas do projeto mm's computing, Scan_.jar e uk.co.mmscomputing.device.twain.jar, as quais podem ser baixadas aqui. Use JDK 7 32bit.

public class ScannerImageTest extends JFrame implements ScannerListener{

    Scanner scanner;
    ImagePanel imagePanel;
    JButton capturar;
    
    public ScannerImageTest() {                        
        setUpJFrame();
        //busca um scanner conectado à máquina local
        scanner = Scanner.getDevice();
        //registra um objeto ScannerListener para capturar os eventos
        scanner.addListener(this);
        setVisible(true);        
    }        

    private void setUpJFrame() {
        imagePanel = new ImagePanel();        
        capturar = new JButton("Capturar Imagem");
        capturar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    //inicia a digitalização da imagem
                    scanner.acquire();
                } catch (ScannerIOException ex) {
                    ex.printStackTrace();
                }
            }
        });                    
        
        setSize(410, 510);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());                
        getContentPane().add(capturar, BorderLayout.NORTH);
        getContentPane().add(imagePanel, BorderLayout.CENTER);
        setTitle("Hello Scanner!");
}

    //chamado automaticamente pelo listener do scanner
    @Override
    public void update(ScannerIOMetadata.Type type, ScannerIOMetadata siom) {
        if(type.equals(ScannerIOMetadata.ACQUIRED)){            
            //neste ponto o documento foi totalmente digitalizado
            BufferedImage bufferedImage = siom.getImage();
            imagePanel.setScannedImage(bufferedImage);
        }
    }
    
    public static void main(String[] args) {
        //inicia a aplicação
        new ScannerImageTest();
    }
}

class ImagePanel extends JPanel{
    
    Image scannedImage;

    public void setScannedImage(Image scannedImage) {
        this.scannedImage = scannedImage;
        if(scannedImage != null){
            this.scannedImage = scannedImage.getScaledInstance(400, 500, 0);
        }
        super.repaint();
    }
    
    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);  
      if(scannedImage != null){        
        Graphics2D g2d = (Graphics2D) g.create();        
        g2d.drawImage(scannedImage, 0, 0, null);
        g2d.dispose();
      }
    }        
}

A aplicação captura a imagem e a exibe em um painel:




A biblioteca do projeto mm's computing permite que o programador utilize uma interface gráfica padrão, com mais recursos de digitalização, neste caso uma nova janela é exibida durante o processo; ou é possível acoplar uma interface mais simples no frame, chamando o método:

Scanner.getDevice().getScanGUI()