InterfaceGrafica.java Source code

Java tutorial

Introduction

Here is the source code for InterfaceGrafica.java

Source

/*
 * Copyright (C) 2017 vitorcezar
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.apache.commons.collections15.Transformer;

/**
 *
 * @author vitorcezar
 */
public class InterfaceGrafica extends JFrame {

    private JButton ativarButton;
    private JPanel graficoPanel;
    private JPanel painelModoLeituraInformacoes;
    private JPanel painelBotoes;
    private JButton lerDadosButton;
    private JComboBox<String> modoLeituraComboBox;
    private JLabel modoLeituraLabel;
    private JButton mostrarDadosButton;
    private JButton pausarButton;
    private final static double HEIGHT_REDIMENSION = 0.8;
    private Thread threadInterface;
    private String[][] dadosRecebidos;

    /**
     * construtor da interface grfica
     */
    public InterfaceGrafica() {
        super("Interface TinyOS");
        inicializaComponentes();
        ativarModoAutonomo();
        adicionaListeners();
        threadInterface = null;
    }

    /**
     * mostra a interface grfica para o usurio. Uma nova thread  criada
     * nessa funo, ou seja, a interface ser executada paralelamente ao
     * cdigo
     */
    public void mostreInterfaceGrafica() {
        this.setVisible(true);
    }

    /**
     * modo ativo, em que o usurio deve mandar o programa ler as etiquetas
     */
    private void ativarModoAutonomo() {
        ativarButton.setEnabled(true);
        pausarButton.setEnabled(true);
        lerDadosButton.setEnabled(false);
    }

    /**
     * modo autnomo, em que o programa l as etiquetas automaticamente
     */
    private void ativarModoAtivo() {
        ativarButton.setEnabled(false);
        pausarButton.setEnabled(false);
        lerDadosButton.setEnabled(true);
    }

    /**
     * adiciona os listeners dos componentes
     */
    private void adicionaListeners() {
        modoLeituraComboBox.addItemListener((e) -> {
            if (modoLeituraComboBox.getSelectedIndex() == 0) {
                ativarModoAutonomo();
            } else {
                ativarModoAtivo();
            }
        });
        mostrarDadosButton.addActionListener((e) -> {
            if (dadosRecebidos != null) {
                new TabelaInformacoes(dadosRecebidos).mostrarInformacoesTabela();
            }
        });
        lerDadosButton.addActionListener((e) -> {
            ComunicacaoNos comunicacao = new ComunicacaoNos();

            Thread thread = new Thread(() -> {
                while (!comunicacao.mensagemRecebida())
                    ;
                byte[] bytesRecebidos = comunicacao.pegaMensagemRecebida();
                ArrayList<ArrayList<String>> strings = retornaDadosLidos(bytesRecebidos);
                adicionaGrafico(retornaDadosTopologia(strings));
                dadosRecebidos = retornaDadosInformacoes(strings);
            });
            thread.start();
        });
        ativarButton.addActionListener((e) -> {
            ComunicacaoNos comunicacao = new ComunicacaoNos();
            threadInterface = new Thread(() -> {
                while (true) {
                    while (!comunicacao.mensagemRecebida())
                        ;
                    byte[] bytesRecebidos = comunicacao.pegaMensagemRecebida();
                    ArrayList<ArrayList<String>> strings = retornaDadosLidos(bytesRecebidos);
                    adicionaGrafico(retornaDadosTopologia(strings));
                    dadosRecebidos = retornaDadosInformacoes(strings);
                }
            });
            threadInterface.start();
        });
        pausarButton.addActionListener((e) -> {
            if (threadInterface != null) {
                threadInterface.interrupt();
            }
        });
    }

    private String[][] retornaDadosTopologia(ArrayList<ArrayList<String>> mensagem) {
        ArrayList<ArrayList<String>> retorno = new ArrayList<>();
        for (ArrayList<String> array : mensagem) {
            if (array.get(1).equals("top")) {
                ArrayList<String> newArray = new ArrayList<>();
                for (int i = 1; i < array.size(); i++) {
                    newArray.add(array.get(i));
                }
                retorno.add(newArray);
            }
        }
        String[][] stringsRetorno = new String[retorno.size()][];
        for (int i = 0; i < retorno.size(); i++) {
            stringsRetorno[i][0] = retorno.get(i).get(0);
            stringsRetorno[i][1] = retorno.get(i).get(1);
        }

        return stringsRetorno;
    }

    private String[][] retornaDadosInformacoes(ArrayList<ArrayList<String>> mensagem) {
        ArrayList<ArrayList<String>> retorno = new ArrayList<>();
        for (ArrayList<String> array : mensagem) {
            if (array.get(1).equals("inf")) {
                ArrayList<String> newArray = new ArrayList<>();
                for (int i = 1; i < array.size(); i++) {
                    newArray.add(array.get(i));
                }
                retorno.add(newArray);
            }
        }
        String[][] stringsRetorno = new String[retorno.size()][];
        for (int i = 0; i < retorno.size(); i++) {
            stringsRetorno[i][0] = retorno.get(i).get(0);
            stringsRetorno[i][1] = retorno.get(i).get(1);
            stringsRetorno[i][2] = retorno.get(i).get(2);
        }

        return stringsRetorno;
    }

    /**
     * retorna mensagem lida em string
     * @param mensagemRecebida
     * @return 
     */
    private ArrayList<ArrayList<String>> retornaDadosLidos(byte[] mensagemRecebida) {
        ArrayList<ArrayList<String>> mensagemRetorno = new ArrayList<>();
        int index = 0;
        while (index < mensagemRecebida.length) {
            if (mensagemRecebida[index + 1] == 2) {
                ArrayList<String> stringLida = new ArrayList<>();
                stringLida.add("top");
                ArrayList<String> mensagens = retornaStringByteRecebido(index, mensagemRecebida);
                for (String mensagem : mensagens) {
                    stringLida.add(mensagem);
                }
                index += mensagemRecebida[index];
                mensagemRetorno.add(stringLida);
            } else if (mensagemRecebida[index + 1] == 4) {
                ArrayList<String> stringLida = new ArrayList<>();
                stringLida.add("inf");
                ArrayList<String> mensagens = retornaStringByteRecebido(index, mensagemRecebida);
                for (String mensagem : mensagens) {
                    stringLida.add(mensagem);
                }
                index += mensagemRecebida[index];
                mensagemRetorno.add(stringLida);
            }
        }
        return mensagemRetorno;
    }

    /**
     * processa os bytes que foram recebidos
     * @param mensagemRecebida 
     */
    private ArrayList<String> retornaStringByteRecebido(int index, byte[] mensagemRecebida) {
        if (mensagemRecebida[index + 1] == 2) {
            int origem = mensagemRecebida[index + 8] << 8 + mensagemRecebida[index + 9];
            int destino = mensagemRecebida[index + 9] << 8 + mensagemRecebida[index + 10];
            ArrayList<String> stringRetorno = new ArrayList<>();
            stringRetorno.add(Integer.toString(origem));
            stringRetorno.add(Integer.toString(destino));
            return stringRetorno;
        }
        if (mensagemRecebida[index + 1] == 4) {
            int origem = mensagemRecebida[index + 6] << 8 + mensagemRecebida[index + 7];
            int luminosidade = mensagemRecebida[index + 8] << 8 + mensagemRecebida[index + 9];
            int temperatura = mensagemRecebida[index + 10] << 8 + mensagemRecebida[index + 11];
            ArrayList<String> stringRetorno = new ArrayList<>();
            stringRetorno.add(Integer.toString(origem));
            stringRetorno.add(Integer.toString(luminosidade));
            stringRetorno.add(Integer.toString(temperatura));
            return stringRetorno;
        }
        return null;
    }

    /**
     * ler a topologia da memria secundria e desenha o grfico
     */
    private void adicionaGrafico(String[][] nodesConnections) {
        DirectedSparseGraph g = new DirectedSparseGraph();

        int numeroEdge = 0;
        for (String[] connection : nodesConnections) {
            if (!g.containsVertex(connection[0])) {
                g.addVertex(connection[0]);
            }
            if (!g.containsVertex(connection[1])) {
                g.addVertex(connection[1]);
            }
            g.addEdge(Integer.toString(numeroEdge), connection[0], connection[1]);
            numeroEdge++;
        }

        Transformer<String, String> transformer = (String arg) -> arg;

        Dimension dimension = graficoPanel.getSize();
        VisualizationViewer visualizationViewer = new VisualizationViewer(new CircleLayout(g),
                new Dimension((int) dimension.getWidth(), (int) (dimension.getHeight() * HEIGHT_REDIMENSION)));
        visualizationViewer.setBackground(Color.WHITE);
        visualizationViewer.getRenderContext().setVertexLabelTransformer(transformer);
        graficoPanel.setLayout(new BorderLayout());
        graficoPanel.add(visualizationViewer);
        graficoPanel.revalidate();
    }

    /**
     * funo gerada pelo NetBeans para inicializar os componentes
     */
    private void inicializaComponentes() {

        painelModoLeituraInformacoes = new javax.swing.JPanel();
        modoLeituraLabel = new javax.swing.JLabel();
        modoLeituraComboBox = new javax.swing.JComboBox<>();
        mostrarDadosButton = new javax.swing.JButton();
        graficoPanel = new javax.swing.JPanel();
        graficoPanel.setBackground(Color.WHITE);
        painelBotoes = new javax.swing.JPanel();
        ativarButton = new javax.swing.JButton();
        pausarButton = new javax.swing.JButton();
        lerDadosButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        modoLeituraLabel.setText("Modo leitura:");

        modoLeituraComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Autnomo", "Ativo" }));
        modoLeituraComboBox.setFocusable(false);

        mostrarDadosButton.setText("Mostrar dados");
        mostrarDadosButton.setFocusable(false);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(painelModoLeituraInformacoes);
        painelModoLeituraInformacoes.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(jPanel1Layout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addComponent(modoLeituraLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(modoLeituraComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 135,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(mostrarDadosButton, javax.swing.GroupLayout.PREFERRED_SIZE, 202,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(129, 129, 129)));
        jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup().addGap(21, 21, 21)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(modoLeituraLabel)
                                .addComponent(modoLeituraComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(mostrarDadosButton))
                        .addContainerGap(31, Short.MAX_VALUE)));

        javax.swing.GroupLayout graficoPanelLayout = new javax.swing.GroupLayout(graficoPanel);
        graficoPanel.setLayout(graficoPanelLayout);
        graficoPanelLayout.setHorizontalGroup(graficoPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 0, Short.MAX_VALUE));
        graficoPanelLayout.setVerticalGroup(graficoPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 349, Short.MAX_VALUE));

        ativarButton.setText("Ativar");
        ativarButton.setFocusable(false);

        pausarButton.setText("Pausar");
        pausarButton.setFocusable(false);

        lerDadosButton.setText("Ler dados");
        lerDadosButton.setFocusable(false);

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(painelBotoes);
        painelBotoes.setLayout(jPanel3Layout);
        jPanel3Layout
                .setHorizontalGroup(
                        jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(
                                        jPanel3Layout.createSequentialGroup().addGap(28, 28, 28)
                                                .addComponent(ativarButton, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        110, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(18, 18, 18)
                                                .addComponent(pausarButton, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        110, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                                        224, Short.MAX_VALUE)
                                                .addComponent(lerDadosButton,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 151,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(167, 167, 167)));
        jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel3Layout.createSequentialGroup().addGap(27, 27, 27)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ativarButton).addComponent(pausarButton).addComponent(lerDadosButton))
                        .addContainerGap(43, Short.MAX_VALUE)));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(painelModoLeituraInformacoes, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(painelBotoes, javax.swing.GroupLayout.Alignment.TRAILING,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                Short.MAX_VALUE)
                        .addGroup(
                                layout.createSequentialGroup().addContainerGap()
                                        .addComponent(graficoPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addContainerGap()));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addComponent(painelModoLeituraInformacoes, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(graficoPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(painelBotoes, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)));

        pack();
    }
}