2010-01-17 4 views
0

В основном моя программа должна отображать рамку, в которой панель рисует точку на экране в соответствии с «входными» данными (целыми значениями), поступающими из последовательного соединения на моем компьютере.SerialPortEventListener из другого класса

Проблема заключается в следующем: как «передать» значения из последовательного порта в класс «Друг» и вызвать метод REPAINT() ??????????

Учитывая, что через консоль я получаю все данные правильно через UART, метод, который я использовал через EventDriven ... Данные, которые я получаю, в порядке ... они выводятся в консоли, и я получаю именно то значение, которое я ожидал. Но так как класс, который создает основной фрейм и подпанель, является другим классом, как вызвать метод repaint из процедуры eventdriven каждый раз, когда я получаю данные ????

Вот код MainProgram (он отображает рамку и создать субпанель на западной стороне):

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JRootPane; 


public class ArtificialHorizon{ 

    /** 
    * Artificial Horizont program 
    * written in Java 1.6.12 (on Debian 5.0 Lenny) 
    * 
    * @author wilhem 
    * starting date: 15 Januar 2010 
    * 
    * last update: 18 Januar 2010 
    */ 


    /******************************** 
    * Getting the size of the screen 
    ********************************/ 
    private Dimension dimScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    private int xLocation; 
    private int yLocation; 


    /************************** 
    * Definition of the frame 
    * for the main application 
    *************************/ 
    @SuppressWarnings("static-access") 
    public void start(){ 
     JFrame mainFrame = new JFrame("Artificial Horizont"); 
     mainFrame.setUndecorated(true); 
     mainFrame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(1024, 768); 
     xLocation = (dimScreenSize.width- mainFrame.getWidth())/2; 
     yLocation = (dimScreenSize.height - mainFrame.getHeight())/2; 
     mainFrame.setLocation(xLocation, yLocation); 

     mainFrame.setResizable(true); 
     mainFrame.setLayout(new BorderLayout()); 


     /******************************************** 
     * Creating the Left PANEL 
     * which contains the Left Artificial Horizon 
     * for FILTERED Outputs (Processed by Kalman) 
     ********************************************/ 

     ArtificialHorizonPanel leftPanel = new ArtificialHorizonPanel(); 
     ArtificialHorizonPanel rightPanel = new ArtificialHorizonPanel(); 

     mainFrame.getContentPane().add(BorderLayout.WEST, leftPanel); 

     mainFrame.setVisible(true); 

     /************************************************ 
     * Create the class RS232 and the Object "serial" 
     ***********************************************/ 
     SerialConnection serial = new SerialConnection("/dev/ttyUSB0", 9600); 

    } 



    public static void main(String[] args) { 

     ArtificialHorizon artificialHorizon = new ArtificialHorizon(); 
     artificialHorizon.start();  // Starting the application 

    } 

} 

Hre класс для ПОДСЕКЦИИ (обратите внимание, что код еще не закончен ... потому что я не могу «читать» и перекрашивать drwa на панели, когда новые данные были получены):

import gnu.io.SerialPortEventListener; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JPanel; 


public class ArtificialHorizonPanel extends JPanel{ 

    /************************************ 
    * In this Class the Artificial Horizon 
    ************************************/ 

    /**************************** 
    * Defining instance variables 
    ****************************/ 
    private Color blueSky; 
    private Color orangeEarth; 
    private Dimension dimPanel; 
    private Point2D centerPoint; 
    private int side = 4; 


    /************************************ 
    * Thic constructor will create 
    * the initial panel for the Horizon 
    ************************************/ 
    public ArtificialHorizonPanel(){ 

     dimPanel = new Dimension(400, 700); 
     setPreferredSize(dimPanel); 
     setBackground(Color.black); 

     centerPoint = new Point2D.Double(dimPanel.getWidth()/2, dimPanel.getHeight()/2); // Create a point in the middle of the panel 

     blueSky = new Color(10, 112, 156); 
     orangeEarth = new Color(222, 132, 14); 

    } 

    public void paintComponent(Graphics g){ 

     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D)g; 

     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     Rectangle2D rect = new Rectangle2D.Double((centerPoint.getX() - side/2), (centerPoint.getY() - side/2), side, side); 

     g2d.setPaint(Color.orange); 
     g2d.draw(rect); 

    } 

} 

и вот код для класса serialdata ... (работает pefectly):

import gnu.io.CommPortIdentifier; 
import gnu.io.PortInUseException; 
import gnu.io.SerialPort; 
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import gnu.io.UnsupportedCommOperationException; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Enumeration; 
import java.util.TooManyListenersException; 



public class SerialConnection implements SerialPortEventListener{ 

    private Enumeration portList = null; 
    private CommPortIdentifier portId = null; 
    private String defaultPort = null; 
    private boolean portFound = false; 
    private int baudRate = 0; 
    private SerialPort serialPort = null; 
    private DataInputStream is = null; 
    private BufferedReader inStream; 



    /******************************** 
    * Constructor for the base class 
    *******************************/ 
    public SerialConnection(String defaultPort, int baudrate){ 

     this.defaultPort = defaultPort; 
     checkPorts();      // Call a method for checking ports on the System 

    } 


    /************************************ 
    * This method checks the presence of 
    * ports on the System, in affirmative 
    * case initializes and configures it 
    * to receive data on the serial port 
    ***********************************/ 

    public void checkPorts(){ 

     /*************************************** 
     * Get a list of all ports on the system 
     **************************************/ 
     portList = CommPortIdentifier.getPortIdentifiers(); 
     System.out.println("List of all serial ports on this system:"); 

     while(portList.hasMoreElements()){ 
      portId = (CommPortIdentifier)portList.nextElement(); 
      if(portId.getName().equals(defaultPort)){ 
       portFound = true; 
       System.out.println("Port found on: " + defaultPort); 

       initialize();  // If Port found then initialize the port 

      } 
     } 

     if(!portFound){ 
      System.out.println("No serial port found!!!"); 
     } 
    } 

    public void initialize(){ 
     /********************** 
     * Open the serial port 
     *********************/ 
     try{ 
      serialPort = (SerialPort)portId.open("Artificial Horizont", 2000); 
     } catch (PortInUseException ex){ 
      System.err.println("Port already in use!"); 
     } 

     // Get input stream 
     try{ 
      is = new DataInputStream(serialPort.getInputStream()); 
     } catch (IOException e){ 
      System.err.println("Cannot open Input Stream " + e); 
      is = null; 
     } 


     try{ 
      serialPort.setSerialPortParams(this.baudRate, 
              SerialPort.DATABITS_8, 
              SerialPort.STOPBITS_1, 
              SerialPort.PARITY_NONE); 
     } catch (UnsupportedCommOperationException ex){ 
      System.err.println("Wrong settings for the serial port: " + ex.getMessage()); 
     } 


     try{ 
      serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); 
     } catch (UnsupportedCommOperationException ex){ 
      System.err.println("Check the flow control setting: " + ex.getMessage()); 
     } 

     // Add an event Listener 
     try{ 
      serialPort.addEventListener(this); 
     } catch (TooManyListenersException ev){ 
      System.err.println("Too many Listeners! " + ev); 
     } 

     // Advise if data available to be read on the port 
     serialPort.notifyOnDataAvailable(true); 
    } 


    /********************************** 
    * Method from interface definition 
    *********************************/ 
    public void serialEvent(SerialPortEvent event){ 

     inStream = new BufferedReader(new InputStreamReader(is), 5); 
     String rawInput = null; 

     switch(event.getEventType()){ 
     case SerialPortEvent.BI: 
     case SerialPortEvent.CD: 
     case SerialPortEvent.CTS: 
     case SerialPortEvent.DSR: 
     case SerialPortEvent.FE: 
     case SerialPortEvent.OE: 
     case SerialPortEvent.PE: 
     case SerialPortEvent.RI: 
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      break; 

     case SerialPortEvent.DATA_AVAILABLE: 
      try { 
       while((rawInput = inStream.readLine()) != null){ 
        System.out.println(rawInput); 
/* 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!HERE I GET THE VALUE FROM THE SERIAL PORT AND THOSE MUST BE "VISIBLE" TO THE SUBPANEL CLASS IN ORDER AND RUN THE METHOD REPAINT!!!!!!!!!!!!!!!!!!!!! 
*/ 
       } 

       inStream.close(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
       System.exit(-1); 
      } 
      break; 

     default: 
      break; 

     } 
    } 

} 

Опять же ... весь код работает, но я получаю кадр и подпанель работают и в backgrounf значений получили по последовательному соединению, но Inthe консоли ...

ответ

1

SwingWorker идеально подходит для этого. Обсуждаются связанные примеры here и изложены в here. В стороне, обязательно создайте свой графический интерфейс на EDT.

Смежные вопросы