java 线程接口_java - 实现线程的接口

我正在尝试使用接口SerialPortListener将两个类“MyJFrame”和“MySerialPort”“连接”在一起,但我无法知道如何去做。我这样做的原因是因为昨天我有一个问题,从串口缓冲区分配数据到MySerialPort类中的全局String(finalString)。这个字符串应该返回给标签显示的MyJFrame。问题在于我的标签在任何事情之前都会显示finalString

被分配给finalString,因为类在不同的线程中运行。我在论坛上发布了这个问题,并收到了一个建议,使用接口来连接它们的线程,并且我修改了代码。我在哪里使用关键字实现SerialPortListener,我该如何获得价值?

SerialPortListener接口代码

public interface SerialPortListener {

void stringReveivedFromSerialPort(String s);

}MyJFrame类代码

public class MyJFrame extends JFrame{

public MySerialPorts msp = new MySerialPorts();

public MyJFrame(){

initComponents();//draws GUI components

initSerialPorts();//initializes serial ports

}

private void initSerialPorts(){

msp.getPortName();//gets serial port's name (in this example COM1)

msp.openPort();//opens the communication for port COM1

}

private String firmwareVersion(){

//This is the method I call when I want to get the Firmware Version

msp.getFirmwareVersion();//sends command to receive reply from serial device

lblFirmwareVersion.setText();//label that prints the firmware version String

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

new MainJFrame().setVisible(true);

}

});

}

private JLabel lblFirmwareVersion;

}MySerialPort类代码

public class MySerialPort {

//this method is using the jSSC API (java simple serial connector)

//http://code.google.com/p/java-simple-serial-connector/

private SerialPort serialPort;

private int iBaudRate = SerialPort.BAUDRATE_57600;

private int iDataBits = SerialPort.DATABITS_8;

private int iStopBits = SerialPort.STOPBITS_1;

private int iParity = SerialPort.PARITY_NONE;

private String portName = "";

// private String finalString = "";

// private StringBuilder sbBuffer = new StringBuilder();

private List portListeners = new ArrayList();

public void addMyPortListener(SerialPortListener listener) {

portListeners.add(listener);

}

public void removeMyPortListener(SerialPortListener listener) {

portListeners.remove(listener);

}

public void getFirmwareVersion() {

sendPortCommand("\r\n");

}

// public String returnFinalString() {

// return finalString;

// }

public void getPortName() {

String[] ports = SerialPortList.getPortNames();

portName = ports[0];

}

public void openPort() {

serialPort = new SerialPort(portName);

try {

if (serialPort.openPort()) {

if (serialPort.setParams(iBaudRate, iDataBits, iStopBits, iParity)) {

serialPort.addEventListener(new Reader(), SerialPort.MASK_RXCHAR

| SerialPort.MASK_RXFLAG

| SerialPort.MASK_CTS

| SerialPort.MASK_DSR

| SerialPort.MASK_RLSD);

} else {

//Error Message - Can't set selected port parameters!

serialPort.closePort();

}

} else {

//Error Message - Can't open port!

}

} catch (SerialPortException | HeadlessException ex) {

//Error Message - Can't open port! - Do nothing

}

}

private void sendPortCommand(String sSendPortCommand) {

if (sSendPortCommand.length() > 0) {

try {

serialPort.writeBytes(sSendPortCommand.getBytes());

} catch (Exception ex) {

//Error Message - Error occured while sending data!

}

}

}

private class Reader implements SerialPortEventListener {

private String sBuffer = "";

@Override

public void serialEvent(SerialPortEvent spe) {

if (spe.isRXCHAR() || spe.isRXFLAG()) {

if (spe.getEventValue() > 0) {

try {

//Read chars from buffer

byte[] bBuffer = serialPort.readBytes(spe.getEventValue());

sBuffer = new String(bBuffer);

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

for (SerialPortListenerInterface listener : portListeners) {

listener.stringReveivedFromSerialPort(sBuffer);

}

}

});

// The following is the code I had prior to suggestion of using invokeLater instead of invokeAndWait

//

// sbBuffer.setLength(0);

//

// SwingUtilities.invokeAndWait(

// new Runnable() {

//

// @Override

// public void run() {

// sbBuffer.append(sBuffer);

// }

// });

//

// finalString = new String(sbBuffer);

} catch (Exception ex) {

}

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值